- 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.
No comments:
Post a Comment