sql >> Databáze >  >> RDS >> Oracle

Najděte všechny nečíselné hodnoty ve sloupci v Oracle

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

  1. Zálohovat pouze schéma SQL?

  2. SSL pro připojení Nodejs PostgreSQL

  3. Jak odstraním rozšířené znaky ASCII z řetězce v T-SQL?

  4. Zlepšete výkon dotazů SQL Server na velkých tabulkách