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
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a