Poniższe przykłady SQLite zwracają tylko te wiersze, które w danej kolumnie mają wartości nieliczbowe.
Przykładowe dane
Stwórzmy tabelę z przykładowymi danymi:
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
c1
);
INSERT INTO t1 (c1) VALUES
(0),
(1),
(+1),
(-1),
(00.00),
(73.45),
(+73.45),
(-73.45),
(.246),
(-.34e7),
(12.e-3),
(1.2e+4),
('Ten'),
('5 Dollars');
SELECT * FROM t1;
Tabela została utworzona i zawiera następujące dane:
c1 ---------- 0 1 1 -1 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0 Ten 5 Dollars
SQLite używa dynamicznego systemu typów, w którym typ danych wartości jest powiązany z samą wartością, a nie z kolumną (jak w przypadku większości innych RDBMS). Tworząc tabelę, nie określiłem typu danych. Dlatego wartości mogą być dowolnego typu.
Typeof()
Funkcja
Możemy użyć funkcji typeof() SQLite, aby wykluczyć typy numeryczne (real
i integer
) przed zwróceniem w zapytaniu:
SELECT c1
FROM t1
WHERE typeof(c1) <> 'real'
AND typeof(c1) <> 'integer';
Wynik:
c1 --------- Ten 5 Dollars
Oto kolejny przykład, który wyświetla typ danych dla każdego wiersza:
SELECT
c1,
typeof(c1)
FROM t1;
Wynik:
c1 typeof(c1) ---------- ---------- 0 integer 1 integer 1 integer -1 integer 0.0 real 73.45 real 73.45 real -73.45 real 0.246 real -3400000.0 real 0.012 real 12000.0 real Ten text 5 Dollars text
To pokazuje nam, że tylko ostatnie dwa wiersze zawierają dane nieliczbowe (zawierają text
dane).
REGEXP
Funkcja
Inną opcją jest użycie REGEXP
przekazać wyrażenie regularne, aby zwrócić tylko te wartości, które pasują do podanego wzorca.
Przykład:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';
Wynik:
c1 --------- Ten 5 Dollars
Zwróć liczby niebędące liczbami całkowitymi
Jeśli chcemy zwrócić tylko liczby niebędące liczbami całkowitymi, możemy wykonać następujące czynności:
SELECT c1
FROM t1
WHERE typeof(c1) <> 'integer';
Wynik:
c1 ---------- 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0 Ten 5 Dollars
Wyklucza to również liczby całkowite ze znakiem.
Lub możemy użyć wyrażenia regularnego, jeśli nasze wymagania są bardziej szczegółowe:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '^[0-9]+$';
Wynik:
c1 ---------- -1 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0 Ten 5 Dollars
Nie zawiera danych liczbowych
Jeśli chcemy znaleźć wiersze, które nie zawierają żadnych danych liczbowych, możemy wykonać następujące czynności:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '[0-9]+';
Wynik:
c1 --- Ten