typecast string para inteiro - Postgres

122

Estou importando dados de uma tabela que possui feeds brutos no Varchar, preciso importar uma coluna no varchar para uma coluna de string. Eu tentei usar o <column_name>::integeras well, to_number(<column_name>,'9999999')mas estou recebendo erros, pois existem alguns campos vazios, preciso recuperá-los como vazios ou nulos na nova tabela.

Por favor, deixe-me saber se existe uma função para o mesmo.

Vijay DJ
fonte
5
Você poderia nos mostrar a mensagem de erro? Isso ajudaria
Frank Heikens

Respostas:

124

Palpite: Se seu valor for uma sequência vazia, você poderá usar NULLIF para substituí-lo por um NULL:

SELECT
    NULLIF(your_value, '')::int
Frank Heikens
fonte
55

Você pode ir além e restringir esse campo coalescente, como, por exemplo: -

SELECT CAST(coalesce(<column>, '0') AS integer) as new_field
from <table>
where CAST(coalesce(<column>, '0') AS integer) >= 10; 
esfarrapado
fonte
27

Se você precisar tratar colunas vazias como NULLs, tente o seguinte:

SELECT CAST(nullif(<column>, '') AS integer);

Por outro lado, se você tiver NULLvalores que precisa evitar, tente:

SELECT CAST(coalesce(<column>, '0') AS integer);

Eu concordo, a mensagem de erro ajudaria muito.

vyegorov
fonte
24

A única maneira de conseguir não ter um erro por causa de NULL, ou caracteres especiais ou cadeia vazia é fazendo o seguinte:

SELECT REGEXP_REPLACE(COALESCE(<column>::character varying, '0'), '[^0-9]*' ,'0')::integer FROM table
Charles Hamel
fonte
2
Para mim (9.6.2), essa foi a única coisa que funcionou; todas as outras respostas falharam.
Jasper de Vries
2
Não foi possível adicionar um WHERE <column> != NULL?
Matthieu
13

Não sou capaz de comentar (com pouca reputação? Sou bem novo) no post de Lukas.

Na minha configuração PG to_number(NULL)não funciona, então minha solução seria:

SELECT CASE WHEN column = NULL THEN NULL ELSE column :: Integer END
FROM table
niko
fonte
1
Isso deve funcionar, mas deve ser um equivalente exato da NULLIF()abordagem menos detalhada . O padrão realmente define NULLIF como uma forma do predicado CASE.
Krittn
12

Se o valor contiver caracteres não numéricos, você poderá converter o valor em um número inteiro da seguinte maneira:

SELECT CASE WHEN <column>~E'^\\d+$' THEN CAST (<column> AS INTEGER) ELSE 0 END FROM table;

O operador CASE verifica a <coluna>, se corresponder ao padrão inteiro, converte a taxa em um inteiro, caso contrário, retorna 0

Igor Ostrovsky
fonte
0

você pode usar esta consulta

SUM(NULLIF(conversion_units, '')::numeric)
Abdul Quadir
fonte
0

Problema comum

Ingenuamente, digite a conversão de qualquer string em um número inteiro como esse

SELECT ''::integer

Frequentemente resulta no famoso erro:

Query failed: ERROR: invalid input syntax for integer: ""

Problema

O PostgreSQL não possui uma função predefinida para digitar com segurança qualquer string em um número inteiro.

Solução

Crie uma função definida pelo usuário inspirada na função intval () do PHP .

CREATE FUNCTION intval(character varying) RETURNS integer AS $$

SELECT
CASE
    WHEN length(btrim(regexp_replace($1, '[^0-9]', '','g')))>0 THEN btrim(regexp_replace($1, '[^0-9]', '','g'))::integer
    ELSE 0
END AS intval;

$$
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;

Uso

/* Example 1 */
SELECT intval('9000');
-- output: 9000

/* Example 2 */
SELECT intval('9gag');
-- output: 9

/* Example 3 */
SELECT intval('the quick brown fox jumps over the lazy dog');
-- output: 0
Abel Callejo
fonte