今回は前回同様、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紹介でした。