25
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-09-12

はじめに結論

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

以上!

25
21
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?