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.

Exemplo:
SELECT CASE WHEN random() = .1 THEN 'A' WHEN random() = .2 THEN 'B'
ELSE 'C' END FROM tblA
O sistema avalia a expressão da seguinte maneira:
  • 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.

Se você desejar um comportamento diferente no exemplo anterior, é possível usar uma subconsulta, como no exemplo a seguir :
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.

Exemplo original no formato 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.