Pokud někdy narazíte na sloupec znaků, který by měl být číselným sloupcem, vždy existuje možnost, že obsahuje nečíselná data, o kterých nevíte.
V Oracle Database můžete spustit dotaz podobný následujícímu a vrátit nečíselná data ze sloupce.
Ukázková data
Vytvořme ukázkovou tabulku s VARCHAR2
sloupec a vložte data:
DROP TABLE t1;
CREATE TABLE t1 (
c1 varchar2(255)
);
INSERT ALL
INTO t1 (c1) VALUES ('0')
INTO t1 (c1) VALUES ('1')
INTO t1 (c1) VALUES ('+1')
INTO t1 (c1) VALUES ('-1')
INTO t1 (c1) VALUES ('00.00')
INTO t1 (c1) VALUES ('73.45')
INTO t1 (c1) VALUES ('+73.45')
INTO t1 (c1) VALUES ('-73.45')
INTO t1 (c1) VALUES ('.246')
INTO t1 (c1) VALUES ('-.34e7')
INTO t1 (c1) VALUES ('12.e-3')
INTO t1 (c1) VALUES ('1.2e+4')
INTO t1 (c1) VALUES ('a')
INTO t1 (c1) VALUES ('9afc')
INTO t1 (c1) VALUES ('e7')
INTO t1 (c1) VALUES ('+e0')
INTO t1 (c1) VALUES ('Ten')
INTO t1 (c1) VALUES ('5 Dollars')
SELECT 1 FROM DUAL;
Tabulka obsahuje toto:
SELECT * FROM t1;
Výsledek:
0 1 +1 -1 00.00 73.45 +73.45 -73.45 .246 -.34e7 12.e-3 1.2e+4 a 9afc e7 +e0 Ten 5 Dollars
Sloupec je varchar(255)
sloupec, takže není číselný. Může (a obsahuje) čísla, ale ty jsou uloženy jako znaková data. Může také obsahovat libovolný text (což obsahuje).
Vrátit všechny nenumerické hodnoty
K vrácení nečíselných hodnot z výše uvedené tabulky můžeme použít následující dotaz:
SELECT c1
FROM t1
WHERE NOT REGEXP_LIKE(c1, '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$');
Výsledek:
12.e-3 a 9afc e7 +e0 Ten 5 Dollars
Vrátit jiná než celá čísla
Pokud chceme vrátit pouze necelá čísla, může být dotaz mnohem jednodušší:
SELECT c1
FROM t1
WHERE NOT REGEXP_LIKE(c1, '^[0-9]+$');
Výsledek:
+1 -1 00.00 73.45 +73.45 -73.45 .246 -.34e7 12.e-3 1.2e+4 a 9afc e7 +e0 Ten 5 Dollars
Všimněte si, že tento příklad také nezahrnuje celá čísla se znaménkem.
Neobsahuje číselná data
Pokud chceme pouze najít řádky, které neobsahují žádná číselná data, můžeme provést následující:
SELECT c1
FROM t1
WHERE NOT REGEXP_LIKE(c1, '[0-9]+');
Výsledek:
a Ten
K získání stejného výsledku můžeme alternativně použít třídy POSIX:
SELECT c1
FROM t1
WHERE NOT REGEXP_LIKE(c1, '[[:digit:]]');
Výsledek:
a Ten