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