技術とか戦略とか

証券レガシーシステムを8年いじってから転職した普通の文系SEによるブログ。技術のみではなく趣味の戦略考察についても。

情報処理技術者試験対策「SQL(取得結果に対する条件判定)」

SELECT文で取得した結果に対して、CASE式を使用することで条件判定が可能です。
条件判定を行うことで、SQL文の出力結果を変えることができます。
プログラムのIF文の判定をSQL文の中で行っているようなイメージであり、プログラムを作るまでもない作業で使用する他、プログラムに組み込む場合も使い方次第でプログラムの可読性・保守性を高めることができます。
 
なお、NULLの時に出力結果を変えるだけであればCOALESCE関数の方がスマートなので、これも併せて紹介します。
 
【文法】

  • CASE式(単純CASE式)
    SELECT~FROMの間のカラム指定の箇所で使用する。
    カラムの値に応じて返す値を指定する。
     
    CASE カラム
        WHEN 値 THEN 値
        :
        :
        :
        ELSE 値
    END
     
  • CASE式(検索CASE式)
    SELECT~FROMの間のカラム指定の箇所で使用する。
    式に応じて返す値を指定する。
     
    CASE
        WHEN 式 THEN 値
        :
        :
        :
        ELSE 値
    END
     
  • COALESCE関数
    SELECT~FROMの間のカラム指定の箇所で使用する。
    可変長の引数を持ち、NULLではない最初の値を返す。
     
    COALESCE(値,値…)
     

【対象テーブル例】
商品
+--------+--------+--------+----------+----------+
| 商品ID | 商品名 | 在庫数 | 現在売値 | 標準売値 |
+--------+--------+--------+----------+----------+
| 1      | 商品1 | 60     | 100      | 100      |
| 2      | 商品2 | 60     | 200      | 250      |
| 3      | 商品3 | 15     | 300      | NULL     |
| 4      | 商品4 | 0      | 400      | 350      |
+--------+--------+--------+----------+----------+
 
【取得例】
※ASは省略可能
 
SELECT   商品名,
         CASE 在庫数
             WHEN 0 THEN '品切れ'
             ELSE '在庫有'
         END AS 在庫状況,
         CASE
             WHEN 標準売値 IS NULL THEN '一時品  '
             WHEN 現在売値 = 標準売値 THEN '適正価格 '
             WHEN 現在売値 < 標準売値 THEN '値下げ品 '
             ELSE '便乗値上げ'
         END AS 価格戦略,
         COALESCE(標準売値,現在売値) AS 適正価格
FROM     商品
ORDER BY 商品ID;

+--------+----------+------------+----------+
| 商品名 | 在庫状況 | 価格戦略   | 適正価格 |
+--------+----------+------------+----------+
| 商品1 | 在庫有   | 適正価格  | 100      |
| 商品2 | 在庫有   | 値下げ品  | 250      |
| 商品3 | 在庫有   | 一時品   | 300      |
| 商品4 | 品切れ   | 便乗値上げ | 350      |
+--------+----------+------------+----------+
 
---------------------
目次

https://1drv.ms/b/s!AivF3bzWXOzuhG1Xk5hscKYqkLkM