Re: [pgbr-geral] Comando CASE - PG 8.3.1 - Windows

2008-04-10 Thread Leandro DUTRA
2008/4/10, Celso Cardoso <[EMAIL PROTECTED]>:
> ERROR:  invalid input syntax for integer: "+0018.25"

Mensagem autoexplicativa: o valor não é inteiro.

Versões anteriores violavam o padrão ISO SQL ao fazer conversões implícitas.

-- 
skype:leandro.gfc.dutra?chat  Yahoo!: ymsgr:sendIM?lgcdutra
+55 (11) 3040 7300 r155 gTalk: xmpp:[EMAIL PROTECTED]
+55 (11) 9406 7191ICQ/AIM: aim:GoIM?screenname=61287803
+55 (11) 5685 2219MSN: msnim:[EMAIL PROTECTED]
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Comando CASE - PG 8.3.1 - Windows

2008-04-10 Thread Celso Cardoso
On 4/10/08, Leandro DUTRA <[EMAIL PROTECTED]> wrote:
>
> 2008/4/10, Celso Cardoso <[EMAIL PROTECTED]>:
> > ERROR:  invalid input syntax for integer: "+0018.25"
>
> Mensagem autoexplicativa: o valor não é inteiro.
>
> Versões anteriores violavam o padrão ISO SQL ao fazer conversões
> implícitas.
>
> --


Ok Leandro.
Obrigado pela resposta.
Porém, qual seria a sintaxe a ser usada se quero que, na hora do UPDATE,
gravar NULL caso
o conteúdo a ser gravado for Zero ? Pergunto isto pois isto só ocorre se
faço a instrução (que sempre
usei) usando o comando CASE.

Obrigado.

Celso Cardoso
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Comando CASE - PG 8.3.1 - Windows

2008-04-10 Thread Leandro DUTRA
2008/4/10, Celso Cardoso <[EMAIL PROTECTED]>:
>
> Porém, qual seria a sintaxe a ser usada se quero que, na hora do UPDATE,
> gravar NULL caso  o conteúdo a ser gravado for Zero ?

O ideal seria 0 mesmo, NULL não é valor e deveria ser evitado sempre
que possível.

Mas use o CASE para dar NULL quando for 0.

-- 
skype:leandro.gfc.dutra?chat  Yahoo!: ymsgr:sendIM?lgcdutra
+55 (11) 3040 7300 r155 gTalk: xmpp:[EMAIL PROTECTED]
+55 (11) 9406 7191ICQ/AIM: aim:GoIM?screenname=61287803
+55 (11) 5685 2219MSN: msnim:[EMAIL PROTECTED]
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Comando CASE - PG 8.3.1 - Windows

2008-04-10 Thread Celso Cardoso
On 4/10/08, Leandro DUTRA <[EMAIL PROTECTED]> wrote:
>
> 2008/4/10, Celso Cardoso [EMAIL PROTECTED]:




O ideal seria 0 mesmo, NULL não é valor e deveria ser evitado sempre
> que possível.
>
> Mas use o CASE para dar NULL quando for 0.
>
> --


Desculp-me Leandro, mas, não entendi.

Voce escreveu acima  "Mas use o CASE para dar NULL quando for 0."

Este é o motivo do e-mail. Para campos NUMERIC estou tendo esta mensagem de
erro:
ERROR:  invalid input syntax for integer:

Gostaria de saber então o motivo do erro, sendo que isto não acontece em
outros tipos de variáveis,
como CHAR, INTEGER, DATE, etc.. Só acontece com NUMERIC e quando do uso do
comando CASE.

Celso Cardoso
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Comando CASE - PG 8.3.1 - Windows

2008-04-10 Thread Osvaldo Rosario Kussama
Celso Cardoso escreveu:
> Bom dia pessoal.
> Sempre utilizei o comando CASE, porém, como estou utilizando o PG 8.3.1
> rodando com ODBC, deparei-me com algo curioso quando o campo em questão
> é do formato NUMERIC.
> Tenho o seguinte comando:
>  
> EXEC SQL
> UPDATE PRODUTO SET PROD_CUSTONOVO = CASE WHEN :PROD_CUSTONOVOW
> = 0 THEN NULL ELSE :PROD_CUSTONOVOW END
> WHERE  PROD_CODIGO= :PROD_CODIGOW
> END-EXEC
>  
> ERROR:  invalid input syntax for integer: "+0018.25"
>  
> Quero que, caso o campo a gravar que é o PROD_CUSTONOVOW seja ZERO, que
> grave NULL na tabela de PRODUTOS.
> O que ocorre é que, como este campo é um NUMERIC(10:2), o comando dá
> erro. Não que dê erro usando o PGADMIN, mas dá erro na minha aplicacao
> que roda sob ODBC. Peguei o erro quando acionei o LOG do Banco e
> percebi que ele coloca ASPAS SIMPLES no campo, ou seja, tratando-o como
> se fosse um String.
>  
> 
> ..COMANDO QUE O PG RECEBE (PEGO PELO LOG)
>  
> UPDATE PRODUTO SET PROD_CUSTONOVO=CASE WHEN '+0018.25'=0 THEN NULL
> ELSE '+0018.25' END WHERE PROD_CODIGO=3
> ERROR:  invalid input syntax for integer: "+0018.25"
>  
> Se este comando CASE é executado com campos CHAR, INT, etc..  não dá 
> erro. Porém, se o campo é um NUMERIC, dá este erro: ERROR:  invalid 
> input syntax for integer:
>  
> Voces tem algo a comentar sobre este erro?
>  


Tente utilizar o cast.
WHEN cast(:PROD_CUSTONOVOW AS NUMERIC(10:2)) = 0 THEN NULL

Osvaldo
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Comando CASE - PG 8.3.1 - Windows

2008-04-10 Thread Leandro DUTRA
2008/4/10, Celso Cardoso <[EMAIL PROTECTED]>:
>
> On 4/10/08, Leandro DUTRA <[EMAIL PROTECTED]> wrote:
> > 2008/4/10, Celso Cardoso [EMAIL PROTECTED]:
> > Mas use o CASE para dar NULL quando for 0.
>
> Desculp-me Leandro, mas, não entendi.

Aparentemente você não leu minha primeira resposta.


> Voce escreveu acima  "Mas use o CASE para dar NULL quando for 0."
>
> Este é o motivo do e-mail. Para campos NUMERIC estou tendo esta mensagem de
> erro:
> ERROR:  invalid input syntax for integer:

Porque aquele número não é um inteiro.


> Gostaria de saber então o motivo do erro, sendo que isto não acontece em
> outros tipos de variáveis,
> como CHAR, INTEGER, DATE, etc.. Só acontece com NUMERIC e quando do uso do
> comando CASE.

Um colega já deu a solução, mas eu queria que você entendesse que
precisa fazer uma conversão explícita de dados.  Não tem nada a ver
com o CASE.


-- 
skype:leandro.gfc.dutra?chat  Yahoo!: ymsgr:sendIM?lgcdutra
+55 (11) 3040 7300 r155 gTalk: xmpp:[EMAIL PROTECTED]
+55 (11) 9406 7191ICQ/AIM: aim:GoIM?screenname=61287803
+55 (11) 5685 2219MSN: msnim:[EMAIL PROTECTED]
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Comando CASE - PG 8.3.1 - Windows

2008-04-10 Thread Euler Taveira de Oliveira
Celso Cardoso wrote:

> UPDATE PRODUTO SET PROD_CUSTONOVO=CASE WHEN '+0018.25'=0 THEN NULL
> ELSE '+0018.25' END WHERE PROD_CODIGO=3
> ERROR:  invalid input syntax for integer: "+0018.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 '+0018.25', então 
segundo a regra [1], ele acha que '+0018.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 '+0018.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