Los siguientes ejemplos de PostgreSQL devuelven solo aquellas filas que tienen valores numéricos en una columna determinada.
Datos de muestra
Vamos a crear una tabla con datos de muestra:
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 tabla ahora se ha creado y contiene los siguientes datos:
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 columna es un varchar(255)
columna, por lo que no es numérico. Puede (y contiene) números, pero estos se almacenan como datos de caracteres. También puede contener texto arbitrario (y lo hace).
Devolver todos los valores numéricos
Podemos usar la siguiente consulta para devolver todos los valores numéricos de la tabla anterior:
SELECT c1
FROM t1
WHERE c1 ~ '^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$';
Resultado:
c1 -------- 0 1 +1 -1 00.00 73.45 +73.45 -73.45 .246 -.34e7 1.2e+4
Devolver enteros
Si solo queremos devolver números enteros, la consulta puede ser mucho más simple:
SELECT c1
FROM t1
WHERE c1 ~ '^[0-9]+$';
Resultado:
c1 ---- 0 1
Contiene datos numéricos
Si queremos encontrar filas que contengan datos numéricos (incluso si también contienen datos no numéricos), podemos hacer lo siguiente:
SELECT c1
FROM t1
WHERE c1 ~ '[0-9]+';
Resultado:
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
En PostgreSQL, ~
es un operador que distingue entre mayúsculas y minúsculas para hacer coincidir la expresión regular dada. Para coincidencias que no distinguen entre mayúsculas y minúsculas, use ~*
.
Puedes usar !~
para devolver todas las filas que no coinciden con la expresión regular (y !~*
para coincidencias que no distinguen entre mayúsculas y minúsculas).
Clases de caracteres POSIX
Postgres también admite clases de caracteres POSIX. Entonces podemos usar [:digit:]
en lugar de [0-9]
si lo preferimos.
Ejemplo:
SELECT c1
FROM t1
WHERE c1 ~ '^[[:digit:]]?$';
Resultado:
c1 ---- 0 1