Voce já chegou a usar a funcão coalesce()? sintaxe. select coalesce(campo,valor)
-----Mensagem original----- De: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] nome de Rudinei Dias Enviada em: quinta-feira, 7 de dezembro de 2006 09:12 Para: [EMAIL PROTECTED]; Grupo de Usuários do PostgreSQL no Brasil Assunto: Re: [PostgreSQL-Brasil]Colaboração: Funções Colega, gostei da idéia. Então começo com duas sugestões e também com um questionamento. Sugestaão 1: Como antes de vir para o PostgreSQL trabalhava muito com ORACLE, me deparei com a terrível falta do comando NVL, que em caso do campo ser null numa querie, retornava um valor default como segue: select nvl(campo, 0) as novonome, .... from tabela. onde o primeiro argumento é o nome do campo e o segundo o valor dafault. Então desenvolvi a função nvl no pg/plsql da seguinte forma: CREATE OR REPLACE FUNCTION nvl(int4, int4) RETURNS int4 AS $BODY$ DECLARE pCAMPO ALIAS FOR $1; pSUBST ALIAS FOR $2; BEGIN if (pCAMPO isnull) then return pSUBST; else return pCAMPO; end if; end $BODY$ LANGUAGE 'plpgsql' VOLATILE; O problema que me deparei é que precisei criar uma função nvl para cada tipo de dado tratado, não chega a ser um problema, mas é chato... - CREATE OR REPLACE FUNCTION nvl("numeric", int4) RETURNS int4 AS - CREATE OR REPLACE FUNCTION nvl(bpchar, bpchar) RETURNS bpchar AS - CREATE OR REPLACE FUNCTION nvl(date, date) RETURNS date AS Estas funções "quebraram meu galho", funcionando bem e rápido, principalmente nos casos de portabilidade de aplicações entre bancos distintos. Poderiam ser melhores, nesse sentido peço a colaboração de vocês. Tem como definir tipo de dado genérico no postgres, sem a necessidade de fazer CAST? Sugestão 2: Também senti falta de uma função de conversão to_number (oracle), que faz a conversão pbchar para numero. Como precisei, novamente por questões de portabilidade de aplicações, a criei: CREATE OR REPLACE FUNCTION to_number(bpchar) RETURNS int8 AS $BODY$ DECLARE pCAMPO ALIAS FOR $1; cCAMPO bpchar; vCAMPO int8; BEGIN cCAMPO := trim(translate(upper(pCAMPO),'ÚÁÉÍÓÔÛÎÂÊÃÕÜÙÀÈÌÒ QWERTYUIOP[]ASDFGHJKL;ZXCVBNM,./<>?|{}:"-_=+)(*&[EMAIL PROTECTED]','')); if (cCAMPO='') then cCAMPO='0'; end if; vCAMPO := CAST (cCAMPO as int8); --vCAMPO := cCAMPO; return vCAMPO; end $BODY$ LANGUAGE 'plpgsql' VOLATILE; Estas funções podem não ser o "Estado da Arte", mas resolveram meus problemas naquele determinado momento e situação. Por favor, teçam comentários. Rudinei Dias Iannsp wrote: > [EMAIL PROTECTED] escreveu: > >> Pessoal, >> >> Se me permitem uma colaboração: >> >> <plpgsql> >> >> drop function dias_nummes(integer, integer); >> create or replace function dias_nummes(integer, integer) returns >> integer as >> $$ >> select >> extract(day from (date (trim(to_char($2, '0000'))||'-'||trim(to_char($1, >> '00'))||'-01') + interval '1 month') - interval '1 day')::integer; >> $$ language 'sql'; >> >> select dias_nummes(1, 2006), dias_nummes(2, 2006), dias_nummes(12, 2006), >> dias_nummes(2, 2004); >> >> </plpgsql> >> >> Só com SQL resolve-se o problema, inclusive do ultimo dia de Dezembro. >> >> Cordialmente, >> >> >> -- >> Fabrízio de Royes Mello >> [EMAIL PROTECTED] >> _______________________________________________ >> Grupo de Usuários do PostgreSQL no Brasil >> Antes de perguntar consulte o manual >> http://pgdocptbr.sourceforge.net/ >> >> Para editar suas opções ou sair da lista acesse a página da lista em: >> http://pgfoundry.org/mailman/listinfo/brasil-usuarios >> >> >> > Gostei da resposta, pensei en usar o interval mas não quiz o overhead de > buscar mais uma funcao se com aritimética simples resolvia, mas ficou a > mais simples mesmo, creio eu. > > Pessoal, pensei em propor o seguinte a todos: Que tal começarmos a > enviar propostas para esta lista de soluções para problemas do dia a dia? > > Nós vamos enviando sugestoes de problemas e os integrantes que tiverem > afim vão respondendo com sugestoes de codigo para que cheguemos no final > à uma "biblioteca "de funcoes que podem ajudar a todos. > Bem, se me permitem sugiro os problemas abaixo, que se encaixam em > problemas do tipo simples. > A intenção é criar funcoes que possam ser usadas em qualquer situação, > portanto, genéricas. > > -Pesquisar palavras sem acentos. > -Limpar valores de espaços duplos e espaços no inicio e fim. > -limpar valores de substrings quaisquer. > -verificar dia da semana com resposta em numero e em texto em portugues. > -retornar mes em portugues. > -calcular diferenca de dias entre datas. > -exemplo de funcoes cujo parametro de entrada seja array para que mais > pessoas conheçam esse tipo de implementação. > -modelos de ACL. > -exemplos de funções recursiva > > Bem, estes itens seriam iniciais e quem desejar poderia adicionar mais > itens. > Creio que isso vai facilitar em muito o trabalho de iniciantes e talvez > mostre a muito usuários atuais maneiras diferentes de se resolver os > mesmos "problemas". > > Obrigado. > Grande Abraço. > > > _______________________________________________ Grupo de Usuários do PostgreSQL no Brasil Antes de perguntar consulte o manual http://pgdocptbr.sourceforge.net/ Para editar suas opções ou sair da lista acesse a página da lista em: http://pgfoundry.org/mailman/listinfo/brasil-usuarios _______________________________________________ Grupo de Usuários do PostgreSQL no Brasil Antes de perguntar consulte o manual http://pgdocptbr.sourceforge.net/ Para editar suas opções ou sair da lista acesse a página da lista em: http://pgfoundry.org/mailman/listinfo/brasil-usuarios
