PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Kembalikan Hanya Nilai Numerik dari Kolom Database PostgreSQL

Contoh PostgreSQL berikut hanya mengembalikan baris yang memiliki nilai numerik dalam kolom tertentu.

Contoh Data

Mari kita buat tabel dengan contoh data:

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; 

Tabel sekarang telah dibuat dan berisi data berikut:

 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 Sepuluh 5 Dolar 

Kolomnya adalah varchar(255) kolom, jadi bukan numerik. Itu dapat (dan memang) berisi angka tetapi ini disimpan sebagai data karakter. Itu juga dapat berisi teks arbitrer (yang memang benar).

Kembalikan Semua Nilai Numerik

Kita dapat menggunakan kueri berikut untuk mengembalikan semua nilai numerik dari tabel di atas:

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

Hasil:

 c1 -------- 0 1 +1 -1 00.00 73.45 +73.45 -73.45 .246 -.34e7 1.2e+4

Kembalikan Bilangan Bulat

Jika kita hanya ingin mengembalikan bilangan bulat, kuerinya bisa jauh lebih sederhana:

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

Hasil:

 c1 ---- 0 1

Berisi Data Numerik

Jika kita ingin mencari baris yang berisi data numerik (walaupun baris tersebut juga berisi data non-numerik), kita dapat melakukan hal berikut:

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

Hasil:

 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 Dollars

Di PostgreSQL, ~ adalah operator case-sensitive untuk mencocokkan ekspresi reguler yang diberikan. Untuk kecocokan yang tidak peka huruf besar/kecil, gunakan ~* .

Anda dapat menggunakan !~ untuk mengembalikan semua baris yang tidak cocok dengan ekspresi reguler (dan !~* untuk kecocokan yang tidak peka huruf besar/kecil).

Kelas Karakter POSIX

Postgres juga mendukung kelas karakter POSIX. Jadi kita bisa menggunakan [:digit:] bukannya [0-9] jika kita mau.

Contoh:

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

Hasil:

 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. Beberapa CTE dalam satu permintaan

  2. Cara Mendapatkan Baris Pertama Per Grup di PostgreSQL

  3. Apakah mungkin untuk mematikan pemrosesan kutipan dalam perintah Postgres COPY dengan format CSV?

  4. Bagaimana cara memasukkan JSONB ke Postgresql dengan Python?

  5. GROUP atau DISTINCT setelah JOIN mengembalikan duplikat