Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Tìm tất cả các giá trị không phải dạng số trong một cột trong Oracle

Nếu bạn từng gặp một cột ký tự phải là cột số, thì luôn có khả năng nó chứa dữ liệu không phải số mà bạn không biết.

Trong Cơ sở dữ liệu Oracle, bạn có thể chạy một truy vấn như sau để trả về dữ liệu không phải số từ cột.

Dữ liệu Mẫu

Hãy tạo một bảng mẫu với VARCHAR2 cột và chèn dữ liệu:

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;

Đây là những gì bảng chứa:

SELECT * FROM t1;

Kết quả:

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

Cột là một varchar(255) , vì vậy nó không phải là số. Nó có thể (và không) chứa số nhưng chúng được lưu trữ dưới dạng dữ liệu ký tự. Nó cũng có thể chứa văn bản tùy ý (mà nó có).

Trả lại tất cả các giá trị không phải dạng số

Chúng ta có thể sử dụng truy vấn sau để trả về các giá trị không phải số từ bảng trên:

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

Kết quả:

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

Trả về số không phải là số nguyên

Nếu chúng ta chỉ muốn trả về các số không phải là số nguyên, thì truy vấn có thể đơn giản hơn rất nhiều:

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

Kết quả:

+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

Lưu ý rằng ví dụ này cũng loại trừ các số nguyên có dấu.

Không Chứa Dữ liệu Số

Nếu chúng tôi chỉ muốn tìm các hàng không chứa bất kỳ dữ liệu số nào, chúng tôi có thể làm như sau:

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

Kết quả:

a
Ten

Ngoài ra, chúng ta có thể sử dụng các lớp POSIX để có được kết quả tương tự:

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

Kết quả:

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. GATHER_PLAN_STATISTICS không tạo thống kê kế hoạch cơ bản

  2. Cần tìm thời gian xử lý trung bình giữa tất cả các bản ghi dấu thời gian trong Oracle SQL

  3. ORA-24247:truy cập mạng bị từ chối bởi danh sách kiểm soát truy cập (ACL)

  4. % NOTFOUND có thể trả về null sau khi tìm nạp không?

  5. Hàm POWER () trong Oracle