条件に応じた値を返す

条件式によって異なる値を返すにはCASE句を使います。大きく分けると2つの書式があります。まず1つ目の書式は次の通りです。

SELECT
  CASE
    WHEN 条件式1 THEN 値1
    WHEN 条件式2 THEN 値2
    ELSE 値3
  END
FROM テーブル名;

WHERE句では取得するデータの条件を記述しましたが、CASE句では取得した値を使った条件式を記述します。上記では条件式1が真の場合は値1を返し、条件式1が偽で条件式2が真の場合は値2を返し、いずれに条件式も偽の場合は値3が返されます。

具体的には次のようになります。

select
  case
    when point > 80 then '合格'
    when point > 50 then '追試'
    else '不合格'
  end
from seiseki;

このSELECT文ではseisekiテーブルの「point」カラムの値によって3つの異なる値を取得します。

続いて2つ目の書式です。

SELECT
  CASE 式
    WHEN 値1 THEN 式1
    WHEN 値2 THEN 式2
    ELSE 式3
  END
FROM テーブル名;

この書式ではCASEの後に記載した式の値をWHENの後に記載した値と比較していき、一致した場合にTHENの後に記載された式を返します。

少し分かりにくいと思いますが具体的には次のようになります。

select
  case category
    when '水着' then price * 0.5
    when 'シャツ' then price * 0.8
    else price
  end
from pricelist;

このSELECT文ではpricelistテーブルの「category」カラムの値に応じて「price」カラムの値に割引を適用しています。

サンプル

では実際に試してみます。

次のようなデータが格納されたテーブルを対象にします。

p13-1

それでは「point」カラムの値に応じて3種類の値を取得してみます。

select
  name, point, 
  case
    when point > 80 then '合格'
    when point > 60 then '追試'
    else '不合格'
  end as hantei
from seiseki;

p13-2

今度は別の書式を使ってみます。次のようなテーブルを対象にします。

p13-3

それでは「category」カラムの値に応じて「price」カラムの値に割引を適用した結果をを取得してみます。

select
  name, price as teika, 
  case category
    when 'VIDEO' then price * 0.5
    when 'DVD' then price * 0.8
    else price
  end as hanbai
from pricelist;

p13-4