【SQL実践|実務向け】NULLIF関数で実現する「無効値のスマートな除外」テクニック

1. 導入:なぜNULLIF関数が重要なのか

実務におけるデータ分析や集計業務では、無効な値やエラー値を「計算から除外したい」というケースが頻繁に発生します。例えば、未入力のフラグとして「0」や「-1」が格納されている場合、単純に平均値(AVG)や合計値(SUM)を計算すると、これらの値が計算に含まれてしまい、結果が歪んでしまいます。NULLIF関数を適切に活用することで、アプリケーション側で複雑な条件分岐を書くことなく、SQLのみでスマートに集計から特定の値を排除することが可能になります。

2. 基礎知識:NULLIF関数の仕組み

NULLIF関数は、2つの引数を受け取り、それらを比較して結果を返すシンプルな関数です。

書式:NULLIF(値1, 値2)

動作の仕組みは以下の通りです。
・値1と値2が等しい場合:NULLを返します。
・値1と値2が等しくない場合:値1をそのまま返します。

この関数の強力な点は、集計関数(AVG, SUM, COUNT等)が「NULL値を計算対象から除外する」という特性を持っていることです。つまり、NULLIFを使って無効値をNULLに置換するだけで、集計関数が自動的にその行を無視して計算してくれるようになります。

3. 実装/解決策:集計から無効値を取り除く

例えば、試験結果を格納したテーブルにおいて、欠席やエラーを意味する「-1」という数値が含まれているとします。これを集計から除外して正しい平均値を出したい場合、以下のように記述します。

4. サンプルプログラム:NULLIFの活用例

— テキストテーブルの作成
CREATE TABLE tokuten (
name TEXT,
point INTEGER
);

— サンプルデータの挿入(-1は欠席等の無効値を想定)
INSERT INTO tokuten VALUES(‘Yamada’, 84);
INSERT INTO tokuten VALUES(‘Suzuki’, 73);
INSERT INTO tokuten VALUES(‘Hori’, -1);
INSERT INTO tokuten VALUES(‘Endou’, 91);

— 【ケース1】単純な平均:-1も計算に含まれてしまい、平均値が低く算出される
SELECT AVG(point) FROM tokuten;

— 【ケース2】NULLIFを活用:-1をNULLに変換して計算対象から除外する
— NULLIF(point, -1) が -1 の場合に NULL となるため、AVGは残りの3件のみを計算する
SELECT AVG(NULLIF(point, -1)) AS valid_avg FROM tokuten;

5. 応用・注意点:現場で役立つ補足

■ 陥りやすい罠:0の扱い
実務で最も多いミスは、0を無効値として扱う際です。「0」は数値として意味を持つ場合が多く、単にNULLIF(price, 0)としてしまうと、価格が0円の商品まで計算から除外されてしまいます。ビジネスロジック上、その0が「データなし」を意味するのか「価格0」を意味するのかを明確に定義してから使用してください。

■ COALESCE関数との組み合わせ
NULLIF関数でNULLに変換した結果、表示上「NULL」ではなく「0」や「未計測」と表示したい場合は、COALESCE関数と組み合わせてください。

例:SELECT COALESCE(NULLIF(point, -1), 0) FROM tokuten;

この組み合わせを覚えておくと、データクレンジングの工数が大幅に削減できます。ぜひ日々のクエリ作成に取り入れてみてください。

コメント

タイトルとURLをコピーしました