Re: [pgbr-geral] Comando CASE - PG 8.3.1 - Windows
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
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/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
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
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/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
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