Rodrigo

Bacana sua abordagem com o array.

Gostaria se possível que esclarecesse o seu "repúdio" com o CASE a título de 
informação, sei que ele torna  a consulta mais pesada em algumas situações, 
porém em certas ocasiões uso o CASE como um "Binary OR"  dentro de clausulas 
WHERE com um ganho de performance significativo em relação a um filtro com  AND 
OR (que também é oneroso).

Seria um caso para a criação de um operador como o "?" do C ? (se é que ele não 
existe)

Aproveitando a deixa.

Teremos um stand do PostgreSQL no FISL?
Moro em Porto Alegre posso contribuir em algo se precisar.

[]'s Pedrosinho


  ----- Original Message ----- 
  From: Rodrigo Hjort 
  To: Grupo de Usuários do PostgreSQL no Brasil 
  Sent: Saturday, March 17, 2007 8:38 PM
  Subject: Re: [PostgreSQL-Brasil] Dias da Semana


  Pessoal,

  Já que querem usar a cláusula CASE (a qual repudio veementemente), por que 
não usam-na de outra forma [1], que onera um pouco menos o SGBD? É o análogo de 
se trocar um IF-ELSEIF-...-ELSEIF por um SWITCH CASE. Além disso, usar as 
funções extract() ou date_part() para retornar o dia da semana [2] é bem mais 
elegante e seguro do que usar uma função de formatação/transformação como o 
to_char(). 

  A consulta poderia ficar assim:

  SELECT
    CASE extract(dow from now())
      WHEN 0 THEN 'domingo'
      WHEN 1 THEN 'segunda'
      -- ...
      WHEN 6 THEN 'sábado'
      ELSE 'erro' 
    END;

  Mas, para simplificar e deixar mais limpo o código, usaria a forma a seguir:

  SELECT 
('{domingo,segunda,terça,quarta,quinta,sexta,sábado}'::text[])[extract(dow from 
now()) + 1];

  [1] http://www.postgresql.org/docs/current/static/functions-conditional.html
  [2] http://www.postgresql.org/docs/8.2/interactive/functions-datetime.html

  -- 
  Atenciosamente,

  Rodrigo Hjort
  Icewall Tecnologias
  http://www.icewall.com.br



  2007/3/16, Adriano Espinoza de Oliveira <[EMAIL PROTECTED]>:
    Uso a função abaixo, bem parecida com o que a Milena sugeriu:

    CREATE OR REPLACE FUNCTION "public"."dia_da_semana" (integer) RETURNS 
varchar AS
    $body$
    begin
      return
        case
          when $1 = 0 then 'domingo' 
          when $1 = 1 then 'segunda'
          when $1 = 2 then 'terça'
          when $1 = 3 then 'quarta'
          when $1 = 4 then 'quinta'
          when $1 = 5 then 'sexta'
          when $1 = 6 then 'sábado' 
          else 'ERRO'
        end;
    end;
    $body$
    LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;




    Em 16/03/07, [EMAIL PROTECTED] < [EMAIL PROTECTED]> escreveu:
          Milena...
          Vai aí uma dica...

      SELECT CASE WHEN TO_CHAR(CURRENT_DATE, 'D') = 1 THEN 'DOMINGO'
                  WHEN TO_CHAR(CURRENT_DATE, 'D') = 2 THEN 'SEGUNDA'
                  WHEN TO_CHAR(CURRENT_DATE, 'D') = 3 THEN 'TERCA'
                  WHEN TO_CHAR(CURRENT_DATE, 'D') = 4 THEN 'QUARTA'
                  WHEN TO_CHAR(CURRENT_DATE, 'D') = 5 THEN 'QUINTA'
                  WHEN TO_CHAR(CURRENT_DATE, 'D') = 6 THEN 'SEXTA'
                  WHEN TO_CHAR(CURRENT_DATE, 'D') = 7 THEN 'SABADO'
             END AS DIA_DA_SEMANA;


         --
      Sidnei Samuel Klein 





------------------------------------------------------------------------------


  _______________________________________________
  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

Responder a