はじめに結論
WHERE句の中でCASE文を使用することができる。
CASE文を使用することで検索対象のカラムを切り替えることができる。
対象言語
Transact-SQLで動作確認済、すみません他のデータベース言語では未検証です
(2017/07/06 MySQLでも動作確認済み @n_s_y_m さんありがとうございます。)
使用例
前提
テーブル Member
には日付型のBirthDate(誕生日)、RegistDate(登録日)、LeaveDate(退会日)というカラムが存在する。
ID | ... | BirthDate | RegistDate | LeaveDate |
---|---|---|---|---|
1 | ... | 1980-01-01 | 2016-09-11 | 2016-09-12 |
2 | ... | 1990-02-01 | 2016-09-12 | NULL |
3 | ... | 1970-03-01 | 2016-09-13 | 2016-09-13 |
やりたいこと
SQL内の変数 @SearchMode
の値をもとに、会員の期間抽出条件を変えたい。
-
@SearchMode = 1
の場合は、登録日の期間抽出を行う。 -
@SearchMode = 2
の場合は、退会日の期間抽出を行う。 -
それ以外
の場合は、誕生日の期間抽出を行う。
SQL
WHERE句の中でCASE文を使用することで日付検索対象のカラムを切り替えることで実現可能です。
DECLARE
@StartDate date
, @EndDate date
, @SearchMode int
SET @StartDate = '2016/09/01'
SET @EndDate = '2016/09/12'
SET @SearchMode = 1 -- 期間の抽出条件(1:登録日, 2:退会日, それ以外:誕生日)
SELECT TOP 100
*
FROM
Member
WHERE
(
CASE @SearchMode
WHEN 1 THEN RegistDate
WHEN 2 THEN LeaveDate
ELSE BirthDate
END
) BETWEEN @StartDate AND @EndDate
SET @SearchMode = 1
の実行結果
ID | ... | BirthDate | RegistDate | LeaveDate |
---|---|---|---|---|
1 | ... | 1980-01-01 | 2016-09-11 | 2016-09-12 |
2 | ... | 1990-02-01 | 2016-09-12 | NULL |
SET @SearchMode = 2
の実行結果
ID | ... | BirthDate | RegistDate | LeaveDate |
---|---|---|---|---|
1 | ... | 1980-01-01 | 2016-09-11 | 2016-09-12 |
SET @SearchMode = 0
(それ以外)の実行結果
ID | ... | BirthDate | RegistDate | LeaveDate |
---|
以上!