CASE
O padrão SQL não permite o uso de funções não determinísticas, como a função NPS® ' random(), nas cláusulas WHEN da expressão CASE. Mas, como uma extensão do padrão, o NPS SQL permite esse uso. Tome cuidado com esse tipo de expressão, já que o comportamento pode não ser o esperado.
SELECT CASE WHEN random() = .1 THEN 'A' WHEN random() = .2 THEN 'B'
ELSE 'C' END FROM tblA
- Gere um número aleatório
- Se o número gerado for .1, retorne 'A'
- Gere um segundo número aleatório
- Se o novo número gerado for .2, retorne 'B'
- Caso contrário, retorne 'C'
Desse modo, sistema avalia a função random() separadamente ao avaliar cada expressão WHEN. Isso é importante quando as funções não determinísticas como random() estiverem envolvidas, e cada execução pode retornar um valor diferente.
SELECT CASE WHEN rand = .1 THEN 'A' WHEN rand = .2 THEN 'B' ELSE 'C'
END
FROM (SELECT random() rand FROM tblA LIMIT ALL) subset
LIMIT ALL na subconsulta evita que ela seja enviada para a consulta pai, e a função random() é invocada somente uma vez para cada linha de tblA e, portanto, o mesmo resultado random() é testado em cada cláusula WHEN.
O exemplo anterior utilizou um formulário de expressão CASE que o padrão chama de CASE procurada. Mas o SQL oferece outra forma de expressão CASE, chamada CASE simples.
SELECT CASE random() WHEN .1 THEN 'A' WHEN .2 THEN 'B' ELSE 'C' END
FROM tblA
Nesse formulário, parece que a função " random() é chamada uma vez. Mas o padrão diz que a expressão CASE simples significa exatamente a mesma coisa que a CASE procurada mais detalhada equivalente. Portanto, o sistema manipula esses dois exemplos da mesma maneira, e os mesmos cuidados se aplicam.
Há outras variantes de CASE, como NULLIF, NVL, NVL2, COALESCE e DECODE, que são convertidos em expressões CASE e, portanto, mostram o mesmo comportamento e exigem o mesmo cuidado.