株式会社シベスピ 従業員ブログ

シベスピの社員ブログ。技術・想い・経験沢山書いていきます!

動的に条件を切り替えるSQL

SBです。
今回は前回同様、SQLを備忘録がてら紹介します。
Oracleにて動的に条件を切り替えるSQLです。

テーブルはこんな感じ
在庫テーブル

区分 商品 在庫
食物 リンゴ 20
食物 バナナ 10
その他 ドライバー 10
その他 タオル 5

在庫に関して、食物は10以下、その他の場合は5以下の時に発注をしたいです。
なので、今回の場合は以下を抽出します。

区分 商品 在庫
食物 バナナ 10
その他 タオル 5


最初考えたときはこんな感じのSQLを想定していました。

SELECT * FROM 在庫テーブル
WHERE CASE WHEN 区分 = 食物 THEN 在庫 <= 10
           WHEN 区分 = その他 THEN 在庫 <= 5


が結果は、ORA-00905 キーワードがありませんとエラーが出ました。
調べた感じMySQLでは使えるようですが、Oracleでは使えませんでした。
SQL単体ではCASE句のみの対応のため、使える箇所は項目として使用する箇所のみのようです。
上記の記述だとCASE文になるためその場合はPL/SQLが必要になってくるとのこと。

なので今回の例だとCASE句に書き換えた以下のSQLで抽出できます。

SELECT * FROM 在庫テーブル
WHERE CASE WHEN 区分 = 食物 THEN 10
           WHEN 区分 = その他 THEN 5
           END >= 在庫 


ただ、もっと複雑な条件になってくると煩雑になってくるので、基本的にはこう書くのが一番簡潔でよいのかなと思います。

SELECT * FROM 在庫テーブル
WHERE (区分 = 食物 AND 在庫 <= 10)
   OR (区分 = その他 AND 在庫 <= 5)

以上、備忘録がてらのSQL紹介でした。