Celso Cardoso wrote:
> UPDATE PRODUTO SET PROD_CUSTONOVO=CASE WHEN '+00000018.25'=0 THEN NULL
> ELSE '+00000018.25' END WHERE PROD_CODIGO=3
> ERROR: invalid input syntax for integer: "+00000018.25"
>
No comando acima, o PostgreSQL "sabe" o tipo de um dos operandos (o tipo
do 0 -- que é inteiro) mas não "sabe" o tipo de '+00000018.25', então
segundo a regra [1], ele acha que '+00000018.25' (na verdade para o
PostgreSQL ele é unknown) é int e por isso você vê o erro acima.
A dica que o Osvaldo deu é correta pois você está informando ao
PostgreSQL que o tipo de '+00000018.25' é numeric e, então, o PostgreSQL
converte o 0 para que ele possa fazer a comparação.
Vamos a um exemplo:
euler=# create table foo (a int);
CREATE TABLE
euler=# insert into foo values(123);
INSERT 0 1
euler=# create table bar (a numeric);
CREATE TABLE
euler=# insert into bar values(1.23);
INSERT 0 1
euler=# update foo set a=case when '123'=0 then null else 123 end;
UPDATE 1
Aqui o comando é executado com sucesso porque o PostgreSQL supõe (a
partir do operando da direita que é um integer) que o operando da
esquerda também é um integer; e a comparação é feita com sucesso.
euler=# update bar set a=case when '1.23'=0 then null else 1.23 end;
ERRO: sintaxe de entrada é inválida para integer: "1.23"
Aqui o comando falha porque o PostgreSQL "erra" ao supor que o operando
da esquerda é um integer (por isso o erro).
euler=# update bar set a=case when '1.23'=0.0 then null else 1.23 end;
UPDATE 1
Aqui o comando é executado com sucesso porque o PostgreSQL supõe (a
partir do operando da direita que é um float) que o operando da esquerda
também é um float.
euler=# update bar set a=case when cast('1.23' as numeric)=0 then null
else 1.23 end;
UPDATE 1
É a opção mais segura pois o PostgreSQL não precisa supor nada.
Por último, evite conversões implícitas para não ter surpresas.
[1] http://www.postgresql.org/docs/8.3/static/typeconv-union-case.html
--
Euler Taveira de Oliveira
http://www.timbira.com/
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral