PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Restituisce solo i valori numerici da una colonna del database PostgreSQL

I seguenti esempi di PostgreSQL restituiscono solo quelle righe che hanno valori numerici in una determinata colonna.

Dati di esempio

Creiamo una tabella con dati di esempio:

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;

La tabella è stata ora creata e contiene i seguenti dati:

    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
 Ten
 5 Dollars

La colonna è un varchar(255) colonna, quindi non è numerico. Può (e contiene) numeri, ma questi vengono memorizzati come dati di caratteri. Può anche contenere testo arbitrario (cosa che fa).

Restituisci tutti i valori numerici

Possiamo utilizzare la seguente query per restituire tutti i valori numerici dalla tabella sopra:

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

Risultato:

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

Restituisce numeri interi

Se vogliamo restituire solo numeri interi, la query può essere molto più semplice:

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

Risultato:

 c1 
----
 0
 1

Contiene dati numerici

Se vogliamo trovare righe che contengono dati numerici (anche se contengono anche dati non numerici), possiamo fare quanto segue:

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

Risultato:

    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

In PostgreSQL, ~ è un operatore con distinzione tra maiuscole e minuscole per la corrispondenza dell'espressione regolare data. Per le corrispondenze senza distinzione tra maiuscole e minuscole, usa ~* .

Puoi usare !~ per restituire tutte le righe che non corrispondono all'espressione regolare (e !~* per le corrispondenze senza distinzione tra maiuscole e minuscole).

Classi di caratteri POSIX

Postgres supporta anche le classi di caratteri POSIX. Quindi possiamo usare [:digit:] invece di [0-9] se preferiamo.

Esempio:

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

Risultato:

 c1 
----
 0
 1