No PostgreSQL, tenho uma tabela com uma coluna varchar. Os dados devem ser inteiros e eu preciso deles no tipo inteiro em uma consulta. Alguns valores são cadeias vazias. Os seguintes:
SELECT myfield::integer FROM mytable
rendimentos ERROR: invalid input syntax for integer: ""
Como posso consultar um elenco e ter 0 em caso de erro durante o elenco no postgres?
sql
postgresql
casting
silviot
fonte
fonte
E'\\d{1,5}$'
.{1,5}
limite de Bobort acima nos dígitos é possivelmente uma boa idéia se você estiver preocupado com o estouro, mas mascarará números maiores, o que pode causar problemas se você estiver convertendo uma tabela. Pessoalmente, prefiro ter o erro de consulta antecipadamente e saber que alguns dos meus "números inteiros" são estranhos (você também pode selecionar com oE'\\d{6,}$'
primeiro para ter certeza).Você também pode criar sua própria função de conversão, dentro da qual você pode usar blocos de exceção:
Teste:
fonte
INSERT
statement?Eu tinha o mesmo tipo de necessidade e achei que isso funcionava bem para mim (postgres 8.4):
Alguns casos de teste para demonstrar:
Se você precisar lidar com a possibilidade de o campo ter texto não numérico (como "100bad"), você pode usar regexp_replace para eliminar caracteres não numéricos antes da conversão.
Valores de texto / varchar como "b3ad5" também fornecerão números
Para abordar a preocupação de Chris Cogdon com a solução de não dar 0 para todos os casos, incluindo um caso como "ruim" (sem caracteres de dígito), fiz esta declaração ajustada:
Funciona de maneira semelhante às soluções mais simples, exceto que dará 0 quando o valor a ser convertido for apenas caracteres que não sejam dígitos, como "incorreto":
fonte
Isso pode ser um pouco complicado, mas o trabalho foi feito no nosso caso:
Explicação (Testada no Postgres 8.4):
A expressão acima mencionada gera
NULL
valores NULL emmyfield
e0
para cadeias vazias (esse comportamento exato pode ou não se encaixar no seu caso de uso).Dados de teste:
A consulta produzirá o seguinte resultado:
Considerando que somente selecionar
values::integer
resultará em uma mensagem de erro.Espero que isto ajude.
fonte
SELECT CASE WHEN myfield="" THEN 0 ELSE myfield::integer END FROM mytable
Eu nunca trabalhei com o PostgreSQL, mas verifiquei o manual quanto à sintaxe correta das instruções IF nas consultas SELECT.
fonte
@ A resposta de Matthew é boa. Mas pode ser mais simples e rápido. E a pergunta pede para converter strings vazias (
''
) em0
, mas não em outras "sintaxe de entrada inválida" ou "fora do intervalo":Isso retorna
0
para uma sequência vazia eNULL
para qualquer outra entrada inválida.Pode ser facilmente adaptado para qualquer conversão de tipo de dados .
Inserir um bloco de exceção é substancialmente mais caro. Se cadeias vazias são comuns , faz sentido capturar esse caso antes de gerar uma exceção.
Se cadeias vazias forem muito raras, vale a pena mover o teste para a cláusula de exceção.
fonte
Esta função sempre retornará
0
se não houver dígitos na sequência de entrada.SELECT parse_int('test12_3test');
retornará
123
fonte
Achei o código a seguir fácil e funcional. A resposta original está aqui https://www.postgresql.org/message-id/[email protected]
espero que ajude
fonte
SUBSTRING pode ajudar em alguns casos, você pode limitar o tamanho do int.
fonte
Se os dados deveriam ser números inteiros e você só precisa desses valores como números inteiros, por que não percorre a milha inteira e converte a coluna em uma coluna inteira?
Em seguida, você pode fazer essa conversão de valores ilegais em zeros apenas uma vez, no ponto do sistema em que os dados são inseridos na tabela.
Com a conversão acima, você está forçando o Postgres a converter esses valores repetidamente para cada linha única em cada consulta da tabela - isso pode prejudicar seriamente o desempenho se você fizer muitas consultas nessa coluna nesta tabela.
fonte
A seguinte função não
error_result
) para resultados não determináveis, por exemplo,abc
ou999999999999999999999999999999999999999999
null
comonull
bigints
são comparadoslower_bound
com, por exemplo, impor apenas valores positivosfonte
Eu também tenho a mesma necessidade, mas isso funciona com o JPA 2.0 e o Hibernate 5.0.2:
Faz maravilhas. Eu acho que funciona com o LIKE também.
fonte
Isso também deve fazer o trabalho, mas é através do SQL e não do postgres específico.
fonte