75584


SQLを勉強しております。初歩的なことかもしれませんが、アドバイスをいただけませんでしょうか。

[code]

    Item ID, small_category, mid_category, large_category
    332, ルアー, 釣具, スポーツ
    445, ソフト, 据え置きゲーム, ホビー
    551, 野球, スポーツ, NULL, NULL
    661, ホビー, NULL, NULL, NULL
    
[/code]

このようなデータがあったときに、  
どのItem IDにおいてはも一番最大のカテゴリを表示したい場合はどのようなSQLが必要でしょうか。

期待するアウトプット

[code]

    Item ID, catgory
    332, スポーツ
    445, ホビー
    551, スポーツ
    661, ホビー
    
[/code]

下記のようなコードを作って実行すると、

[code]

    Item ID,
    CASE
            WHEN mid_category = NULL THEN small_category
            WHEN large_cateogry = NULL THEN mid_category
            ELSE large_category
            END as category
    
[/code]

結果

[code]

    Item ID, catgory
    332, スポーツ
    445, ホビー
    551, NULL
    661, NULL
    
[/code]

このような結果になってしまいました。  
上記コードだとlarge_categoryが無いケースだとうまくいきましたが、  
Categoryの階層が増えるとうまくいきませんでした。


CC BY-SA 4.0
2021-04-30T04:07:43.383
75583
2021-04-30T14:58:33.653
2021-04-30T14:58:33.653
19110
23420
question
sql
SQLで列の値がNullではない列の値を表示する


SQLは他のプログラミング言語と少し異なります。  
まず論理値は`TRUE` / `FALSE`の2値論理ではなく、`TRUE` / `FALSE` /
`UNKNOWN`の[3値論理](https://ja.wikipedia.org/wiki/3%E5%80%A4%E8%AB%96%E7%90%86)となっています。その上で、[SQLにおける`NULL`](https://ja.wikipedia.org/wiki/Null#SQL%E3%81%AENULL)も異なり、`NULL`との比較は全て`UNKNOWN`になります。  
そのため、

[code]

    mid_category = NULL
    
[/code]

は常に`UNKNOWN`であり、`TRUE`ではないため不成立と判断されます。`NULL`であるかを比較するために`IS`演算子が用意されており、

[code]

    Item ID,
    CASE
            WHEN mid_category IS NULL THEN small_category
            WHEN large_cateogry IS NULL THEN mid_category
            ELSE large_category
            END as category
    
[/code]

と記述するとよいでしょう。（この順で比較したいかは質問者さんの判断に任せます。）


CC BY-SA 4.0
2021-04-30T04:55:48.773
75584
2021-04-30T04:55:48.773
4236
75583
answer