Následující příklady SQLite vrátí pouze ty řádky, které mají v daném sloupci nečíselné hodnoty.
Ukázková data
Vytvořme tabulku s ukázkovými daty:
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;
Tabulka byla nyní vytvořena a obsahuje následující údaje:
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 používá dynamický typový systém, kde datový typ hodnoty je spojen s hodnotou samotnou, nikoli se sloupcem (jako u většiny ostatních RDBMS). Když jsem vytvořil tabulku, nespecifikoval jsem datový typ. Hodnoty tedy mohou být libovolného typu.
Typeof()
Funkce
Můžeme použít funkci typeof() SQLite k vyloučení číselných typů (real
a integer
) z vracení v dotazu:
SELECT c1
FROM t1
WHERE typeof(c1) <> 'real'
AND typeof(c1) <> 'integer';
Výsledek:
c1 --------- Ten 5 Dollars
Zde je další příklad, který zobrazuje typ dat pro každý řádek:
SELECT
c1,
typeof(c1)
FROM t1;
Výsledek:
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 nám ukazuje, že pouze poslední dva řádky obsahují nenumerická data (obsahují text
data).
REGEXP
Funkce
Další možností je použít REGEXP
předat regulární výraz, který vrátí pouze ty hodnoty, které odpovídají danému vzoru.
Příklad:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';
Výsledek:
c1 --------- Ten 5 Dollars
Vrátí jiná než celá čísla
Pokud chceme vrátit pouze necelá čísla, můžeme udělat následující:
SELECT c1
FROM t1
WHERE typeof(c1) <> 'integer';
Výsledek:
c1 ---------- 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0 Ten 5 Dollars
To také nezahrnuje celá čísla se znaménkem.
Nebo bychom mohli použít regulární výraz, pokud jsou naše požadavky konkrétnější:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '^[0-9]+$';
Výsledek:
c1 ---------- -1 0.0 73.45 73.45 -73.45 0.246 -3400000.0 0.012 12000.0 Ten 5 Dollars
Neobsahuje číselná data
Pokud chceme najít řádky, které neobsahují žádná číselná data, můžeme udělat následující:
SELECT c1
FROM t1
WHERE c1 NOT REGEXP '[0-9]+';
Výsledek:
c1 --- Ten