CASE式は、IF-ELSEをSQL中で実現できる汎用的な条件式です。
SELECT句でよく使われ、うまく使用すると威力を発揮します。
今回の記事では、このCASE式についての基本的な使い方を解説していきます。
CASE式とは
CASE式を使用することで、SQL中で条件制御を行うことが出来ます。
「条件と言えば、WHERE句やHAVING句とは違うの?」という疑問がわきます。WHERE句やHAVING句は出力条件を実現しますが、CASE式は条件により値を変換することを実現する事が出来ます。
また、CASE式はORACLEだけで使用できる式ではありません。SQLの標準に取り入れられているので他のDBでも使用できます。(SQLServer、MYSQLなど)
CASE式には、単純CASE式と検索CASE式の2種類があります。それぞれについて、これから解説していきます。
単純CASE式
単純CASE式は、ある項目の値を元に条件分岐させるものです。CやJAVAを知っている方なら、SWITCH文と同じイメージと言えば伝わりますでしょうか。
-- aがbの時cを設定し、一致する値がない時はdを設定 -- bとcのセットは、最低1つ指定し、ELSEは省略可能 -- ELSEを省略した場合で、一致する値がない時はNULLを設定します CASE a WHEN b1 THEN c1 WHEN b2 THEN c2 … ELSE d END
以下具体的な使用例です。
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の評価が出来ない点です。気をつけましょう。
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式と比較して、汎用的に使用できます。
-- aには条件を指定し、条件を満たしている時bを設定 -- aとbのセットは、最低1つ指定し、ELSEは省略可能 -- ELSEを省略した場合で、全ての条件を満たしていない時はNULLを設定します CASE WHEN a1 THEN b1 WHEN a2 THEN b2 … ELSE c END
以下具体的な使用例です。
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】を使用することで実現できます。
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関数)




