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?

Author: leftjoin, 2016-12-07

1 answers

Isto é tudo uma questão de conceito nulo.

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)

 6
Author: leftjoin, 2018-09-29 14:58:25