2017/12/07
CASE式は、IF-ELSEをSQL中で実現できる汎用的な条件式です。
SELECT句でよく使われ、うまく使用すると威力を発揮します。
今回の記事では、このCASE式についての基本的な使い方を解説していきます。
sponsored link
CASE式とは
CASE式を使用することで、SQL中で条件制御を行うことが出来ます。
「条件と言えば、WHERE句やHAVING句とは違うの?」という疑問がわきます。WHERE句やHAVING句は出力条件を実現しますが、CASE式は条件により値を変換することを実現する事が出来ます。
また、CASE式はORACLEだけで使用できる式ではありません。SQLの標準に取り入れられているので他のDBでも使用できます。(SQLServer、MYSQLなど)
CASE式には、単純CASE式と検索CASE式の2種類があります。それぞれについて、これから解説していきます。
単純CASE式
単純CASE式は、ある項目の値を元に条件分岐させるものです。CやJAVAを知っている方なら、SWITCH文と同じイメージと言えば伝わりますでしょうか。
1 2 3 4 5 6 7 8 9 |
-- aがbの時cを設定し、一致する値がない時はdを設定 -- bとcのセットは、最低1つ指定し、ELSEは省略可能 -- ELSEを省略した場合で、一致する値がない時はNULLを設定します CASE a WHEN b1 THEN c1 WHEN b2 THEN c2 … ELSE d END |
以下具体的な使用例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
SELECT gender ,CASE gender WHEN '1' THEN 'MAN' WHEN '2' THEN 'WOMAN' ELSE 'UNKNOWN' END gender_name FROM test_table ; GENDER GENDER_NAME ------- ----------- 1 MAN 2 WOMAN 3 UNKNOWN |
注意点としては、NULLの評価が出来ない点です。気をつけましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
SELECT a ,CASE a WHEN '1' THEN 100 WHEN NULL THEN 200 ELSE 300 END b FROM test_table ; A B - ------- 1 100 2 300 300 |
検索CASE式
検索CASE式は、等価条件以外の条件で条件分岐させるものです。単純CASE式と比較して、汎用的に使用できます。
1 2 3 4 5 6 7 8 9 |
-- aには条件を指定し、条件を満たしている時bを設定 -- aとbのセットは、最低1つ指定し、ELSEは省略可能 -- ELSEを省略した場合で、全ての条件を満たしていない時はNULLを設定します CASE WHEN a1 THEN b1 WHEN a2 THEN b2 … ELSE c END |
以下具体的な使用例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
SELECT gender ,age ,CASE WHEN gender = '1' AND age <= 25 THEN 'YOUNG-MAN' WHEN gender = '2' AND age <= 25 THEN 'YOUNG-WOMAN' WHEN gender = '1' AND age > 25 THEN 'MAN' WHEN gender = '2' AND age > 25 THEN 'WOMAN' ELSE 'UNKNOWN' END attribute FROM test_table ; GENDER AGE ATTRIBUTE ------- ------- ----------- 1 20 YOUNG-MAN 2 18 YOUNG-WOMAN 1 30 MAN 2 60 WOMAN 1 UNKNOWN |
単純CASE式で出来なかったNULLの評価も、【IS NULL】を使用することで実現できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
SELECT a ,CASE WHEN a = '1' THEN 100 WHEN a IS NULL THEN 200 ELSE 300 END b FROM test_table ; A B - ------- 1 100 2 300 200 |
まとめ
ここまでCASE式の使用例を示してきましたが、CASE式はSELECT句で使用することで威力を発揮すること分かります。
ある項目の値を別の値に変換したいことは、よくあることです。
単純CASE式と検索CASE式の違いを理解し、NULLの扱いに特に注意し使用してみましょう。
関連(CASE式)
関連(DECODE関数)