Declarações de casos na colmeia
Ok, eu tenho um seguinte código para marcar os registos que têm o month_cd mais alto em tabl com bandeira binária:
Select t1.month_cd, t2.max_month_cd
,CASE WHEN t2.max_month_cd != null then 0 else 1 end test_1
,CASE WHEN t2.max_month_cd = null then 0 else 1 end test_2
from source t1
Left join (
Select
MAX(month_cd) as max_month_cd
From source
) t2
on t1.month_cd = t2.max_month_cd;
Parece-me directo, mas o resultado é:
month_cd max_month_cd test_1 test_2
201610 null 1 1
201611 201611 1 1
não faz nenhum sentido para mim, e parece ser demasiado óbvio para ser um erro no motor de execução. O que me está a escapar?
1 answers
Uma vez que Null não é um membro de qualquer domínio de dados, não é considerado um "valor", mas sim um marcador (ou substituição) indicando a ausência de valor. Por causa disso, comparações com Null nunca podem resultar em Verdadeiro ou falso, mas sempre em um terceiro resultado lógico, desconhecido. Nulo não é nada, ausência de objeto. Portanto, nada pode ser igual a nulo ou outra coisa. Em SQL existem IS NULL
e IS NOT NULL
condições a utilizar para o ensaio de null valores.
No seu caso, o resultado da expressão lógica é Desconhecido, por isso, o valor é atribuído.
Versão corrigida:
CASE WHEN t2.max_month_cd IS NOT null then 0 else 1 end test_1,
CASE WHEN t2.max_month_cd IS null then 0 else 1 end test_2
Ver esta referência: Null (SQL)