【SQL】サブクエリ(副問合せ)がNULLを含んでいた場合

はじめに

NOT INまたは<>ALLで判定するサブクエリ(副問合せ)の結果にNULLが含まれると、全体の結果もNULLとなります。

データにNULLが含まれると、取得されるはずのデータが取得できなくなることがあるので、サブクエリの結果からNULLを除外する方法を調べてみました。

サブクエリの結果からNULLを除外する方法は2つ

1. サブクエリの絞り込み条件に、IS NOT NULL条件を含める

2. COALESCE関数を使ってNULLを別の値に置き換える

上記それぞれの方法を使って、サブクエリの結果からNULLを除外します

1. サブクエリの絞り込み条件に、IS NOT NULL条件を含める

SELECT * FROM 家計簿
 WHERE 費用 IN ( SELECT 費用 FROM 家計簿
             WHERE 費用 IS NOT NULL )

=> NULLを除外する条件を付与

2. COALESCE関数を使ってNULLを別の値に置き換える

SELECT * FROM 家計簿アーカイブ
 WHERE 費用 IN ( SELECT COALESCE( 費用, '不明’) FROM 家計簿 )

=> 費用がNULLなら代わりに'不明'にする

まとめ f:id:haru89:20200607090344p:plain:w70

データにNULLが含まれていたことが原因で、取得できるはずのデータが取得できないケースは、原因がわかりにくいので、サブクエリの結果から確実にNULLを除外するよう注意が必要だと思います。

参考

スッキリわかるSQL入門 第2版

中山清喬 (著), 飯田理恵子 (著), 株式会社フレアリンク (監修)