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

Chỉ trả về các giá trị số từ một cột cơ sở dữ liệu PostgreSQL

Các ví dụ PostgreSQL sau đây chỉ trả về những hàng có giá trị số trong một cột nhất định.

Dữ liệu mẫu

Hãy tạo một bảng với dữ liệu mẫu:

 DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (
    c1 varchar(255)
);

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'),
    ('a'),
    ('9afc'),
    ('e7'),
    ('+e0'),
    ('Ten'),
    ('5 Dollars');

SELECT * FROM t1; 

Bảng hiện đã được tạo và chứa dữ liệu sau:

 c1 ----------- 0 1 +1 -1 00.00 73.45 +73.45 -73.45 .246 -.34e7 12.e-3 1.2e + 4 a 9afc e7 + e0 Mười 5 đô la 

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ị dạng số

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

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

Kết quả:

 c1 -------- 0 1 +1 -1 00,00 73,45 +73,45 -73,45 .246 -,34e7 1,2e + 4 

Trả về số nguyên

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

 SELECT c1
FROM t1 
WHERE c1 ~ '^[0-9]+$'; 

Kết quả:

 c1 ---- 0 1 

Chứa dữ liệu số

Nếu chúng ta muốn tìm các hàng có chứa dữ liệu số (ngay cả khi chúng cũng chứa dữ liệu không phải số), chúng ta có thể thực hiện như sau:

 SELECT c1 
FROM t1 
WHERE c1 ~ '[0-9]+'; 

Kết quả:

 c1 ----------- 0 1 +1 -1 00.00 73.45 +73.45 -73.45 .246 -.34e7 12.e-3 1.2e + 4 9afc e7 + e0 5 Đô la  

Trong PostgreSQL, ~ là một toán tử phân biệt chữ hoa chữ thường để khớp với biểu thức chính quy đã cho. Đối với các kết quả khớp không phân biệt chữ hoa chữ thường, hãy sử dụng ~* .

Bạn có thể sử dụng !~ để trả về tất cả các hàng không khớp với biểu thức chính quy (và !~* đối với các kết quả phù hợp không phân biệt chữ hoa chữ thường).

Các lớp ký tự POSIX

Postgres cũng hỗ trợ các lớp ký tự POSIX. Vì vậy, chúng ta có thể sử dụng [:digit:] thay vì [0-9] nếu chúng tôi thích.

Ví dụ:

 SELECT c1
FROM t1 
WHERE c1 ~ '^[[:digit:]]?$'; 

Kết quả:

 c1 ---- 0 1 

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Django prefetch_inity với giới hạn

  2. Lưu trữ hình ảnh trong PostgreSQL

  3. Kết nối với Postgresql trong một thùng chứa docker từ bên ngoài

  4. Nối một chuỗi và một số trong PostgreSQL

  5. ClassNotFoundException với PostgreSQL và JDBC