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

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

SQL の関数記事 4 本目です。IF / IIF で 1 つの条件を真偽分岐する書き方、WHERE との違い、LIKE や AND との組み合わせ、ORDER BY や LIMIT を重ねた表示まで、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 テーブルから namesalary`IIF(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 テーブルから namesalary`IIF(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 テーブルから namecity`IIF(name LIKE '%Tanaka' AND city = 'Tokyo', '東京の田中', 'その他')` を `tag` という別名で の 3 列を取り出してください。

SQL エディタ

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

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

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

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

SQL エディタ

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

理解度チェック

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

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

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

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