web-dev-qa-db-ja.com

HiveのCASEステートメント

わかりました。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

私には意味をなさず、実行エンジンのバグであることは明白すぎるようです。何が欠けていますか?

5
JagdCrab

これはすべて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)

11
leftjoin