Help us understand the problem. What is going on with this article?

WHERE句でCASE文を使って検索対象のカラムを切り替える

More than 3 years have passed since last update.

はじめに結論

WHERE句の中でCASE文を使用することができる。
CASE文を使用することで検索対象のカラムを切り替えることができる。

対象言語

Transact-SQLで動作確認済、すみません他のデータベース言語では未検証です :sob:
(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

以上!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away