CASE文のSQLでの使い方

ORACLEのCASE文はかなり便利でいろいろな要件で結構使ったりしますが、
本当に色々できます。

たとえば
・SELECT
・FROM
・WHERE
・GROUP BY
・HAVING
・ORDER BY
などがあります。


こんなテーブルがあったとして

TEST_USER
 ID NUMBER
 NAME VARCHAR2
 AGE NUMBER

TEST_ADDRESS
 ID NUMBER
 ADDRESS VARCHAR2
 TABLE_A_ID NUMBER

SELECTだと

SELECT
   B.ID
  ,B.ADDRESS
  ,(CASE WHEN
     EXISTS(SELECT 1 FROM TEST_USER A WHERE A.ID = B.TEST_USER_ID)
   THEN
     (SELECT A.NAME FROM TEST_USER A WHERE A.ID = B.TEST_USER_ID)
   ELSE
     'NAME IS NULL'
   END
  ) NAME
FROM
  TEST_ADDRESS B

とか

FROMだと結合条件として

SELECT
  B.ADDRESS
FROM
  TEST_ADDRESS B
INNER JOIN
  TEST_USER A
ON
  B.ID = (CASE AGE WHEN 10 THEN A.ID ELSE NULL END)

こんな感じで、AGE が 10のレコードのみ結合してみたり

WHEREだとFROMと同じように

SELECT
   B.ID
  ,B.ADDRESS
  ,B.TEST_USER_ID
FROM
  TEST_ADDRESS B
WHERE
  1 = (CASE B.ADDRESS WHEN 'AD1' THEN 1 ELSE NULL END)

なことができたり

GROUP BYだと

SELECT
  COUNT(*)
FROM
  TEST_USER A
GROUP BY
  (CASE WHEN A.AGE <= 10 THEN 0 ELSE 1 END)

のように AGEの範囲でGROUP出来たり

上の結果をHAVINGで絞り込んでみたい場合は

SELECT
  COUNT(*)
FROM
  TEST_USER A
GROUP BY
  (CASE WHEN A.AGE <= 10 THEN 0 ELSE 1 END)
HAVING
  COUNT(CASE WHEN A.AGE <= 10 THEN 0 ELSE 1 END) > 1

とかできますよ

ORDER BYは、、、ちょっと疲れたので省略します。


しかし色々出来すぎて、DBに処理させるかアプリ側で処理するかで悩んでしまいますね。。




最後にCASEとは関係ないですがWHEREとかで使用するINは

SELECT
  A.NAME1
 ,A.NAME2
 ,A.NAME3
FROM
  TABLE_A A
WHERE
  'あいうえお' IN (A.NAME1,A.NAME2,A.NAME3)

みたいに使うこともできます。
気持ち悪い