CASE式を使ってみよう、基本編

ORACLE

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関数)

タイトルとURLをコピーしました