T-SQL: CASE 式と EXISTS/NOT EXISTS 演算子による条件分岐
SQL: WHERE 句内の IF 構文
T-SQLでは、WHERE 句内で直接IF 構文を使用することはできません。しかし、CASE 式やEXISTS/NOT EXISTS 演算子などを利用することで、条件分岐を実現できます。
方法
CASE 式は、条件に基づいて異なる値を返す式です。WHERE 句内で CASE 式を使用することで、条件分岐を実現できます。
例
SELECT *
FROM テーブル名
WHERE CASE 性別
WHEN '男性' THEN 年齢 > 20
ELSE 年齢 > 18
END;
上記の例では、性別が男性の場合は年齢が20歳以上、女性の場合は年齢が18歳以上であるレコードを抽出します。
EXISTS/NOT EXISTS 演算子は、サブクエリが結果を返すかどうかによって、真偽値を返す演算子です。WHERE 句内で EXISTS/NOT EXISTS 演算子を使用することで、条件分岐を実現できます。
SELECT *
FROM テーブル名
WHERE EXISTS (
SELECT *
FROM 関連テーブル名
WHERE テーブル名.ID = 関連テーブル名.ID
AND 関連テーブル名.条件
);
上記の例では、関連テーブルに条件を満たすレコードが存在するレコードのみを抽出します。
注意事項
- CASE 式と EXISTS/NOT EXISTS 演算子のどちらを使用するかは、状況によって使い分けます。
- CASE 式は、条件分岐の数が少ない場合に適しています。
- EXISTS/NOT EXISTS 演算子は、条件分岐の数が多かったり、複雑な条件分岐を行う場合に適しています。
- どちらの方法を使用する場合でも、WHERE 句の処理順序を考慮する必要があります。
補足
上記以外にも、以下の方法で条件分岐を実現できます。
- UNION ALL を使用して複数の SELECT 文の結果を結合する
- CTE (Common Table Expressions) を使用して中間結果を保存する
これらの方法は、CASE 式や EXISTS/NOT EXISTS 演算子よりも複雑な条件分岐を行う場合に有効です。
CASE 式
SELECT *
FROM 顧客
WHERE CASE 国籍
WHEN '日本' THEN 年齢 > 20
ELSE 年齢 > 18
END;
EXISTS/NOT EXISTS 演算子
SELECT *
FROM 注文
WHERE EXISTS (
SELECT *
FROM 注文明細
WHERE 注文.ID = 注文明細.注文ID
AND 注文明細.商品ID = 1
);
上記の例では、商品IDが1の商品を注文したことがある顧客のみを抽出します。
UNION ALL
SELECT *
FROM 顧客
WHERE 性別 = '男性'
UNION ALL
SELECT *
FROM 顧客
WHERE 性別 = '女性' AND 年齢 > 30;
上記の例では、男性の顧客と、女性で年齢が30歳以上の顧客を抽出します。
CTE
WITH 顧客_年齢 AS (
SELECT *,
CASE 年齢
WHEN 10 THEN '10代'
WHEN 20 THEN '20代'
ELSE '30代以上'
END AS 年齢帯
FROM 顧客
)
SELECT *
FROM 顧客_年齢
WHERE 年齢帯 = '20代';
上記の例では、顧客の年齢帯を10代、20代、30代以上に分類し、20代の顧客のみを抽出します。
IIF 関数 (Transact-SQL)
SELECT *
FROM テーブル名
WHERE IIF(性別 = '男性', 年齢 > 20, 年齢 > 18);
- IIF 関数は、Transact-SQL 固有の関数です。
- CASE 式よりも簡潔に記述できますが、条件分岐の数が多くなると見づらくなる可能性があります。
PIVOT テーブルは、列を軸としてデータを転換する機能です。WHERE 句内で PIVOT テーブルを使用することで、条件分岐を実現できます。
SELECT *
FROM (
SELECT *
FROM テーブル名
WHERE 性別 = '男性'
) AS 男性
PIVOT (
SUM(年齢)
FOR 国籍 IN ([日本], [アメリカ])
) AS t;
上記の例では、男性の顧客の年齢を国籍別に合計します。
- PIVOT テーブルは、複雑な条件分岐を行う場合に有効です。
- 習得に時間がかかる可能性があります。
サブクエリを使用して、条件分岐を実現できます。
SELECT *
FROM テーブル名
WHERE 年齢 IN (
SELECT 年齢
FROM テーブル名
WHERE 性別 = '男性'
);
- 処理速度が遅くなる可能性があります。
SQL: WHERE 句内で条件分岐を実現する方法はいくつかあります。それぞれの方法のメリットとデメリットを理解した上で、状況に合った方法を選択する必要があります。
sql sql-server t-sql