Oracle
 sql >> база данни >  >> RDS >> Oracle

Намерете всички нечислови стойности в колона в Oracle

Ако някога срещнете колона със знаци, която трябва да е числова колона, винаги има възможност тя да съдържа нечислови данни, за които не знаете.

В Oracle Database можете да изпълните заявка като следната, за да върнете нечислови данни от колоната.

Примерни данни

Нека създадем примерна таблица с VARCHAR2 колона и вмъкнете данни:

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;

Ето какво съдържа таблицата:

SELECT * FROM t1;

Резултат:

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

Колоната е varchar(255) колона, така че не е числова. Може (и съдържа) числа, но те се съхраняват като данни за знаци. Може също да съдържа произволен текст (което прави).

Връщане на всички нечислови стойности

Можем да използваме следната заявка, за да върнем нечислови стойности от горната таблица:

SELECT c1
FROM t1 
WHERE NOT REGEXP_LIKE(c1, '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$');

Резултат:

12.e-3
a
9afc
e7
+e0
Ten
5 Dollars

Връщане на нецели числа

Ако искаме да върнем само нецели числа, заявката може да бъде много по-проста:

SELECT c1
FROM t1 
WHERE NOT REGEXP_LIKE(c1, '^[0-9]+$');

Резултат:

+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

Имайте предвид, че този пример също изключва цели числа със знак.

Не съдържа цифрови данни

Ако просто искаме да намерим редове, които не съдържат никакви цифрови данни, можем да направим следното:

SELECT c1 
FROM t1 
WHERE NOT REGEXP_LIKE(c1, '[0-9]+');

Резултат:

a
Ten

Алтернативно можем да използваме POSIX класове, за да получим същия резултат:

SELECT c1 
FROM t1 
WHERE NOT REGEXP_LIKE(c1, '[[:digit:]]');

Резултат:

a
Ten

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Генерирайте тестови данни с помощта на Oracle PL/SQL разработчик

  2. хибернация диалект за оракул 12c

  3. Решение да не може да изпълни DML операция в заявка?

  4. Oracle SQL Часове Разлика между датите в ЧЧ:ММ:СС

  5. Пример за Java в базата данни на Oracle