わかりました。tablでmonth_cdが最も高いレコードをバイナリフラグでマークする次のコードがあります。
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;
それは私には簡単に思えますが、結果は次のとおりです。
month_cd max_month_cd test_1 test_2
201610 null 1 1
201611 201611 1 1
私には意味をなさず、実行エンジンのバグであることは明白すぎるようです。何が欠けていますか?
これはすべてNULLの概念についてです。
Nullはどのデータドメインのメンバーでもないため、「値」とは見なされず、値の不在を示すマーカー(またはプレースホルダー)と見なされます。このため、Nullとの比較でTrueまたはFalseになることはありませんが、常に3番目の論理結果であるUnknownになります。 NULLは何もない、オブジェクトがない場合。したがって、NULLや他の何かと等しくなることはできません。 SQLにはIS NULL
およびIS NOT NULL
null値のテストに使用される条件。
CASEでは論理式の結果が不明であるため、ELSE値が割り当てられます。
修正バージョン:
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
これを参照してください: Null(SQL)