PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Retornar apenas os valores numéricos de uma coluna do banco de dados PostgreSQL


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 é um varchar(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+4

Retornar inteiros


Se quisermos retornar apenas inteiros, a consulta pode ser muito mais simples:
SELECT c1
FROM t1 
WHERE c1 ~ '^[0-9]+$'; 

Resultado:
 c1 ---- 0 1

Conté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