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)
みたいに使うこともできます。
気持ち悪い