Poniższe przykłady SQLite zwracają tylko te wiersze, które mają wartości liczbowe w danej kolumnie.
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). Kiedy tworzyłem tabelę, nie określałem typu danych. Dlatego wartości mogą być dowolnego typu.
Typeof()
Funkcja
Możemy użyć funkcji typeof() SQLite do filtrowania wyników tylko do typów numerycznych (real
i integer
):
SELECT c1
FROM t1
WHERE typeof(c1) = 'real'
OR typeof(c1) = 'integer';
Wynik:
c1 ---------- 0 1 1 -1 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0
Dla jasności, oto 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
REGEXP
Funkcja
Jeśli mamy bardziej szczegółowe wymagania, możemy alternatywnie użyć 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 REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';
Wynik:
c1 ---------- 0 1 1 -1 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0
Zwracane liczby całkowite
Jeśli chcemy zwrócić tylko liczby całkowite, możemy uprościć zapytanie w następujący sposób:
SELECT c1
FROM t1
WHERE typeof(c1) = 'integer';
Wynik:
c1 -- 0 1 1 -1
Zwraca 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 REGEXP '^[0-9]+$';
Wynik:
c1 -- 0 1 1
Zawiera dane liczbowe
Jeśli chcemy znaleźć wiersze zawierające dane liczbowe (nawet jeśli zawierają również dane nieliczbowe), możemy wykonać następujące czynności:
SELECT c1
FROM t1
WHERE c1 REGEXP '[0-9]+';
Wynik:
c1 ---------- 0 1 1 -1 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0 5 Dollars