2017/12/07
CASE式を使用することで、SQL中で条件制御を行うことが出来ます。
本記事では、更新文(UPDATE)やソート(ORDER BY)を絡めるという応用的な使い方を紹介していきたいと思います。
sponsored link
更新文(UPDATE)での使用
UPDATE文の中で使用することで、更新する値に条件をつけることが出来ます。こうすることで、複数回の更新SQLを1回にまとめる事が出来ます。
例えば、商品価格を以下の条件で更新するとします。
- 価格10000円以上の商品は、価格を1.2倍する
- 価格1000円以上10000円未満の商品は、価格を1.1倍する
- 価格1000円未満の商品は、価格を0.9倍する
- 端数は切捨て
CASE式を使わない場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
UPDATE test_table SET price = TRUNC(price * 1.2) WHERE price >= 10000 ; UPDATE test_table SET price = TRUNC(price * 1.1) WHERE price < 10000 AND price >= 1000 ; UPDATE test_table SET price = TRUNC(price * 0.9) WHERE price < 1000 ; |
CASE式を使う場合
1 2 3 4 5 6 7 8 |
UPDATE test_table SET price = CASE WHEN price >= 10000 THEN TRUNC(price * 1.2) WHEN price < 10000 AND price >= 1000 THEN TRUNC(price * 1.1) WHEN price < 1000 THEN TRUNC(price * 0.9) ELSE price END ; |
更新SQLを1回にまとめられるだけでなく、更新SQLを複数回に分けた場合は、更新する順序に気をつける必要があります。
例えば、上記の例で9900円の商品があった場合で1000円以上10000円未満の商品の更新を先に実施した場合を考えてみましょう。
9900円を1.1倍し結果が10890円になります。さらに10000円以上なので次の更新条件の10000円以上の対象にもなり、10890円を1.2倍し結果が13068円になってしまいます。
本来は、10890円にするのが正しいにも関わらずです。
1回のSQLにまとめることで、こうした心配も不要になります。
ソート(ORDER BY)での使用
ソート(ORDER BY)の中で使用することで、複雑なソート順を実現する事が出来ます。
例えば、商品価格を価格の小さい順でソートするとします。ただし、価格が決まっていない商品は0円で登録されており、その場合はソートの最後尾にします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
SELECT code ,price FROM test_table ORDER BY CASE WHEN price = 0 THEN 1 ELSE 0 END ,price ; CODE PRICE ----- ------- 0002 1000 0004 3500 0003 10000 0001 22000 0005 0 |
まとめ
本記事では、更新文やソートが絡んだ使い方を紹介しました。
CASE式は、応用することでSQLで出来ることが大きく広がります。
動作を理解し、ぜひ利用してみましょう。
関連(CASE式)
関連(DECODE関数)