Existe uma maneira "melhor" de reescrever uma SELECT
cláusula em que várias colunas usam as mesmas CASE WHEN
condições para que as condições sejam verificadas apenas uma vez?
Veja o exemplo abaixo.
SELECT
CASE testStatus
WHEN 'A' THEN 'Authorized'
WHEN 'C' THEN 'Completed'
WHEN 'P' THEN 'In Progress'
WHEN 'X' THEN 'Cancelled'
END AS Status,
CASE testStatus
WHEN 'A' THEN authTime
WHEN 'C' THEN cmplTime
WHEN 'P' THEN strtTime
WHEN 'X' THEN cancTime
END AS lastEventTime,
CASE testStatus
WHEN 'A' THEN authBy
WHEN 'C' THEN cmplBy
WHEN 'P' THEN strtBy
WHEN 'X' THEN cancBy
END AS lastEventUser
FROM test
No código psuedo não-sql, o código pode se parecer com:
CASE testStatus
WHEN 'A'
StatusCol = 'Authorized'
lastEventTimeCol = authTime
lastEventUserCol = authUser
WHEN 'C'
StatusCol = 'Completed'
lastEventTimeCol = cmplTime
lastEventUserCol = cmplUser
...
END
Nota:
- Estou ciente dos problemas óbvios de normalização implícitos na consulta. Eu só queria demonstrar o problema.
authTime
,authUser
,cmplTime
estão na mesma mesa?Respostas:
Mesmo no Oracle (e de fato no padrão SQL),
CASE
é uma expressão que retorna um único valor. É não usado para o controle de fluxo como é em alguns outros idiomas. Portanto, não pode ser usado para decidir condicionalmente entre várias colunas ou outras operações.Eu diria que coloque a versão mais longa do código (que já funciona) em uma exibição e não se preocupe com isso em suas consultas formais.
Você também pode considerar um design mais normalizado. Por exemplo, por que não armazenar os detalhes da auditoria em uma tabela separada, com o tipo como parte da chave? Isso torna seu código muito mais fácil de manter, especialmente à medida que mais tipos são adicionados ...
fonte
Se todas essas colunas forem da mesma tabela, você pode usar algo como isto:
fonte