Os exemplos do PostgreSQL a seguir retornam apenas as linhas que possuem valores numéricos em uma determinada coluna.
Dados de amostra
Vamos criar uma tabela com dados de exemplo:
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;
A tabela já foi criada e contém os seguintes dados:
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 Dez 5 dólares
A coluna é umvarchar(255)
coluna, então não é numérico. Ele pode (e contém) números, mas estes são armazenados como dados de caracteres. Ele também pode conter texto arbitrário (o que ele faz).
Retornar todos os valores numéricos
Podemos usar a seguinte consulta para retornar todos os valores numéricos da tabela acima:
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+4Retornar inteiros
Se quisermos retornar apenas inteiros, a consulta pode ser muito mais simples:
SELECT c1 FROM t1 WHERE c1 ~ '^[0-9]+$';
Resultado:
c1 ---- 0 1Contém dados numéricos
Se quisermos encontrar linhas que contenham dados numéricos (mesmo que também contenham dados não numéricos), podemos fazer o seguinte:
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 dólares
No PostgreSQL,~
é um operador que diferencia maiúsculas de minúsculas para corresponder à expressão regular fornecida. Para correspondências que não diferenciam maiúsculas de minúsculas, use~*
.
Você pode usar!~
para retornar todas as linhas que não correspondem à expressão regular (e!~*
para correspondências que não diferenciam maiúsculas de minúsculas).
Classes de caracteres POSIX
O Postgres também suporta classes de caracteres POSIX. Então podemos usar[:digit:]
em vez de[0-9]
se preferirmos.
Exemplo:
SELECT c1 FROM t1 WHERE c1 ~ '^[[:digit:]]?$';
Resultado:
c1 ---- 0 1