Para o PostgreSQL poder chamar a sua função ele deve calcular o valor de
todos os parâmetros, então sua função csw() não vai funcionar para isso. O
correto é usar CASE ... WHEN mesmo:
 
SELECT CASE WHEN c1 <> 0 && c2 <> 0 THEN c1/c2 ELSE 0 END FROM tabela;
 
Não como evitar o processamento prévio dos parâmetros, a não ser que você
passe uma fórmula como caracter para uma função plpgsql, e essa função
execute um PERFORM.
 
Atenciosamente,
 
Márcio Gil.


  _____  

De: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] Em nome de Charles
Viana
Enviada em: quarta-feira, 9 de maio de 2007 11:25
Para: [email protected]
Assunto: [pgbr-geral] Função para substituir Case when


fiz a seguinte função 

CREATE OR REPLACE FUNCTION csw(boolean, anyelement, anyelement) 
RETURNS anyelement AS 
  'select case when $1 then $2 else $3 end;' 
LANGUAGE 'sql' VOLATILE; 

Quando eu passo os paramentros select csw( c1 + c2 > 0 ,c1/c2,0) from
tabela; gera o sequinte erro 

ERROR: division by zero 
SQL state: 22012 

c1 e c2 são campos de uma tabela e as vezes os dois estão zerados ele teria
que executar a codição e verificar que c1 + c2 não é maior que 0 e  retorna
zero. 

O que eu gostaria de fazer é ao inves de fazer case a=a when then a else  b
end; eu gostaria de subustuir a funcao case  para que ficasse assim
csw(a=a,a,b) se qlguem puder me ajudar grato. 
 

_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a