Sunday, August 26, 2007

Função Oracle CASE na linguagem SQL


  • Descrição:

Esta função permite a aplicação da lógica if-then-else em interrogações SQL.

É possível utilizar esta função no select, where, group by, having, order by de uma interrogação.

Configurações possíveis:

CASE "Expressão"

WHEN "valor a testar" THEN

"valor retornar"
WHEN "valor a testar" THEN
"valor retornar"

ELSE

"valor a retornar"

END

ou

CASE
WHEN "condição a avaliar" THEN
"valor retornar"

WHEN "condição a avaliar" THEN

"Valor retornar"
ELSE
"Valor a retornar"
END

Configuração mínima:

CASE

WHEN "condição a avaliar" THEN

"valor retornar"
END

  • Erros:

Quando os valores a retornar pelo CASE não são no mesmo tipo ocorre o erro:

"ORA-00932: inconsistent datatypes: expected .... got ......"


  • Exemplos:

Criar a tabela:

CREATE TABLE ohb_artigos
(artigo_id NUMBER,
artigo_titulo_txt VARCHAR2(200),
artigo_descricao_txt VARCHAR2(4000),
artigo_activo_indc NUMBER(1,0),
artigo_autor_txt VARCHAR2(20),
insercao_data DATE);

Inserir os dados:

INSERT INTO ohb_artigos
("ARTIGO_ID","ARTIGO_TITULO_TXT","ARTIGO_DESCRICAO_TXT","ARTIGO_ACTIVO_INDC","ARTIGO_AUTOR_TXT","INSERCAO_DATA")
VALUES

(1,'Desmistificar comportamentos: NOT IN',NULL,1,'Adriano Teixeira ','7-11-2007 00:00:00')
/

INSERT INTO ohb_artigos
("ARTIGO_ID","ARTIGO_TITULO_TXT","ARTIGO_DESCRICAO_TXT","ARTIGO_ACTIVO_INDC","ARTIGO_AUTOR_TXT","INSERCAO_DATA")
VALUES
(2,'Reset de sequências',NULL,1,'Adriano Teixeira ','7-30-2007 00:00:00')
/

INSERT INTO ohb_artigos
("ARTIGO_ID","ARTIGO_TITULO_TXT","ARTIGO_DESCRICAO_TXT","ARTIGO_ACTIVO_INDC","ARTIGO_AUTOR_TXT","INSERCAO_DATA")
VALUES
(3,'Como começou... ',NULL,1,'Adriano Teixeira ','7-10-2007 00:00:00')
/

INSERT INTO ohb_artigos
("ARTIGO_ID","ARTIGO_TITULO_TXT","ARTIGO_DESCRICAO_TXT","ARTIGO_ACTIVO_INDC","ARTIGO_AUTOR_TXT","INSERCAO_DATA")
VALUES
(4,'Funções na linguagem Oracle SQL',NULL,0,'MNunes','7-12-2007 00:00:00')
/

INSERT INTO ohb_artigos
("ARTIGO_ID","ARTIGO_TITULO_TXT","ARTIGO_DESCRICAO_TXT","ARTIGO_ACTIVO_INDC","ARTIGO_AUTOR_TXT","INSERCAO_DATA")
VALUES
(5,'Função Oracle CASE ',NULL,0,'MNunes','8-26-2007 00:00:00')
/

Exemplo nº1: Obter os títulos dos artigos e os respectivos estados com as seguintes descrições: 'Artigo activo', 'Artigo não activo', 'Artigo censurado'

SELECT oa.artigo_titulo_txt "Titulo", case artigo_activo_indc

when 1 then

'Artigo activo'

when 0 then

'Artigo não activo'

else

'Artigo censurado'

End artigo_estado_txt "Estado"

FROM ohb_artigos oa;





Resultado:

Titulo Estado

Desmistificar comportamentos: NOT IN Artigo activo

Reset de sequências Artigo activo

Como começou... Artigo activo

Funções na linguagem Oracle SQL Artigo não activo

Função Oracle CASE Artigo não activo

Exemplo nº2: Obter os títulos dos artigos e respectivos autores no formato: Titulo - Autor. Caso o artigo não esteja activo assinalar.

select oa.artigo_titulo_txt' - 'oa.artigo_autor_txtcase
when (artigo_activo_indc<>1)then
'(Artigo não activo ou censurado)'
End "Titulo - Autor"
FROM ohb_artigos oa;

Resultado:

"Titulo - Autor"

Desmistificar comportamentos: NOT IN - Adriano Teixeira

Reset de sequências - Adriano Teixeira

Como começou... - Adriano Teixeira

Funções na linguagem Oracle SQL - MNunes(Artigo não activo ou censurado)

Função Oracle CASE - MNunes(Artigo não activo ou censurado)

Exemplo nº3: Ano ou mês ou dia com artigos activos e respectivo nº.
No caso comentei o parâmetro p_tipo_agregacao e coloquei 'MES'.

select case 'MES' --p_tipo_agregacao

when 'ANO' then

TO_CHAR(oa.insercao_data,'RRRR')

when 'MES' then

TO_CHAR(oa.insercao_data,'RRRR-MM')

else

TO_CHAR(oa.insercao_data,'RRRR-MM-DD')

End "Intervalo",

count(case artigo_activo_indc

when 1 then

1

else

null

End

) "nº artigos activos"

from ohb_artigos oa

group by case 'MES' --p_tipo_agregacao

when 'ANO' then

TO_CHAR(oa.insercao_data,'RRRR')

when 'MES' then

TO_CHAR(oa.insercao_data,'RRRR-MM')

else

TO_CHAR(oa.insercao_data,'RRRR-MM-DD')

End

having count(case artigo_activo_indc

when 1 then

1

else

null

End

)>1

order by case 'MES' --p_tipo_agregacao

when 'ANO' then

TO_CHAR(oa.insercao_data,'RRRR')

when 'MES' then

TO_CHAR(oa.insercao_data,'RRRR-MM')

else

TO_CHAR(oa.insercao_data,'RRRR-MM-DD')

End desc

Resultado:

Intervalo nº artigos activos

2007-07 3

Nota:

O SQL foi desenvolvido de forma a apresentar as possibilidades de utilização da função CASE.