順番に読み進めながら学べます

関数 ④ — IF / IIF で 1 条件の分岐表示

この記事は、基礎から複雑なSQL,SQLチューニングまでSQLの実践的なスキルを1からマスターする「SQL入門講座の一部」です。
IF/IIFで1条件を真偽分岐する書き方、行を消すWHEREとの違い、LIKEやANDとの組み合わせまで、CSVの社員データで実行しながら学べます。

本記事で使うデータ — staff テーブル

ここまで関数を 3 本にわたって学んできましたが、本記事と次の 2 本では条件分岐で表示内容を切り替える書き方を扱います。同じ列の値でも、ある条件を満たすかどうかで「高給」「通常」のような分類ラベルを付けたり、複数の値を 1 つの結果列にまとめたりできるようになります。

演習に入る前に、staffテーブルの列定義データのサンプルを確認しておきます。

PRAGMA table_info(staff);で列名・型・主キーを確認してください。

SELECT * FROM staff LIMIT 5;で先頭 5 行のデータをプレビューしてください。

SQL エディタ

クエリを実行してください

IF / IIF — 1 つの条件で値を切り替える

条件式に応じて表示する値を切り替える、もっとも基本の関数がIF / IIFです。書き方は次のとおりで、両者は完全に同じ意味です。

- MySQL: IF(条件式, 真のときの値, 偽のときの値)

- 本講座のコンソール / SQL Server: IIF(条件式, 真のときの値, 偽のときの値)

本講座のコンソールにはIF関数が無いので、本記事の演習ではIIFを使います。WHERE と違って行を絞り込まずに、結果列の値だけを変える役割なので、「全行を残しつつ、列の値ごとに表示ラベルを変えたい」場面で使います。

IF / IIF の構造 — 真と偽で値を切り替える
呼び出し結果IIF(100 < 200, '真', '偽')'真'(条件が TRUE)IIF(500 > 1000, '真', '偽')'偽'(条件が FALSE)IIF(salary >= 5000000, '高給', '通常')行ごとに salary を見て'高給' か '通常' を返す
条件式が TRUE なら 2 番目の引数、FALSE なら 3 番目の引数が返ります。WHERE のように行を消すのではなく、結果列の値を入れ替えるイメージです。
-- 1) リテラルでの動作確認
SELECT IIF(100 < 200, '真', '偽');   -- '真'
SELECT IIF(500 > 1000, '真', '偽');  -- '偽'

-- 2) 列を使った例 — city が Tokyo なら「本社」、それ以外は「支社」
SELECT name, city,
       IIF(city = 'Tokyo', '本社', '支社') AS office
FROM staff;

-- 参考: MySQL では IF()
--   SELECT IF(city = 'Tokyo', '本社', '支社') FROM staff;

経営会議用の社員一覧で「給料 5,000,000 以上を高給、それ未満を通常としてラベル付けしたい」という要件を想定します。(正しく実行できれば解説が表示されます)

staffテーブルからnamesalaryIIF(salary >= 5000000, '高給', '通常')をrankという別名で、計 3 列を取り出してください。

SQL エディタ

クエリを実行してください

WHERE と IF の役割の違い — 行を消す vs 値を変える

WHEREIFはどちらも条件式を書きますが、結果はまったく異なります。

- WHERE: 条件が TRUE の行だけ残し、FALSE / NULL の行は消す

- IF / IIF: すべての行を残し、列の値だけ条件で入れ替える

両者は組み合わせて使えます。「東京在住の社員だけ表示し、その人ごとに給料ランクを高給 / 通常で分けたい」のように、まずWHEREで行を絞り、続くSELECTの列リストでIIFを使って表示変換する、というのが典型的な書き方です。

WHERE と IIF の役割の違い
WHEREIIF条件が TRUE の行だけテーブルに残す全行を残しつつ列の値を切り替える→ 行数が変わる(縦方向の削除)→ 行数は変わらない(横方向の変換)
WHERE は行を絞り込み(縦方向の削除)、IIF は列の値を入れ替える(横方向の変換)。両者は独立した役割で、組み合わせて使えます。
-- WHERE と IIF を組み合わせる
-- 1) WHERE で大阪在住の社員だけに絞り込む
-- 2) IIF で給料 6,000,000 以上を「シニア」に分類
SELECT name, salary,
       IIF(salary >= 6000000, 'シニア', '一般') AS grade
FROM staff
WHERE city = 'Osaka';

「東京拠点のメンバーで給料ランクを並べたい」という要件を想定します。

staffテーブルからnamesalaryIIF(salary >= 5000000, '高給', '通常')をrankという別名での 3 列を取り出してください。

cityが'Tokyo'の行に絞り込んでください。

SQL エディタ

クエリを実行してください

LIKE や AND との組み合わせ、ORDER BY / LIMIT との重ね方

IIFの条件式には WHERE と同じ式が書けるので、LIKE(パターンマッチ)やAND / OR(複合条件)と組み合わせられます。「名前にTanakaを含むなら田中姓ラベル」「30 歳以上かつ Tokyo 在住ならエース」のような分岐も 1 行で書けます。

結果列に付けたAS 別名ORDER BYの対象にも使えるので、IIFで生成したラベル列で並び替えたり、続けてLIMITで件数制限したりするのが、実務でのレポート出力の基本パターンです。

-- 1) IIF + LIKE: 苗字が Tanaka なら '田中姓'
SELECT name,
       IIF(name LIKE '%Tanaka', '田中姓', 'その他') AS surname_check
FROM staff;

-- 2) IIF + AND: 年齢相当 + 都市の複合条件
SELECT name, birthday, city,
       IIF(strftime('%Y', birthday) <= '1989' AND city = 'Osaka',
           '大阪のシニア', 'その他') AS tag
FROM staff;

「東京拠点の田中姓社員にだけ特別なラベルを付けて表示したい」という要件を想定します。1 つの IIF でname LIKE '%Tanaka' AND city = 'Tokyo'のような複合条件を扱う書き方を試します。

staffテーブルからnamecityIIF(name LIKE '%Tanaka' AND city = 'Tokyo', '東京の田中', 'その他')をtagという別名での 3 列を取り出してください。

SQL エディタ

クエリを実行してください

「給料が高い順で上位 3 名を表示しつつ、各人にランクラベルも併記したい」という要件を想定します。

staffテーブルからnamesalaryIIF(salary >= 5000000, '高給', '通常')をrankという別名での 3 列を取り出してください。

salaryの降順で並べ、先頭 3 行に絞ってください。

SQL エディタ

クエリを実行してください
QUIZ

理解度チェック

まずは1問ずつ答えてみましょう。

Q1次のうち、IIF(条件式, X, Y)の説明として正しいものはどれですか。

Q2WHEREIIFの役割の違いとして正しいものはどれですか。

Q3MySQL のIF(salary >= 5000000, '高給', '通常')を本講座のコンソールで動かすときの正しい書き換えはどれですか。