やり方(シンプル)
特定カラムの値が〇〇だったら××、それ以外はNULL。
END
をよく書き忘れるから注意。
SELECT
CASE 判定対象カラム名
WHEN 1 THEN '1だよ'
ELSE NULL
END AS 判定結果カラムエイリアス名
FROM テーブル名
『NULLだったら※※』なら、NVL()
NVL2()
COALESCE()
を使うことも検討。
やり方(WHENが複数)
SELECT
CASE 判定対象カラム名
WHEN 1 THEN '1だよ'
WHEN 2 THEN '2だよ'
ELSE NULL
END AS 判定結果カラムエイリアス名
FROM テーブル名
やり方(CASEで判定対象の指定無し)
CASE
の後に判定対象を指定せずに、 WHEN
の中で判定。
(else ifみたいな使い方)
SELECT
CASE
WHEN 判定対象カラム名1 = 1 THEN 'カラム1は1だよ'
WHEN 判定対象カラム名2 = 1 THEN 'カラム1は1ではなく、カラム2は1だよ'
ELSE NULL
END AS 判定結果カラムエイリアス名
FROM テーブル名
ELSEの省略
ELSE
部分は省略できる。
省略したら ELSE NULL
になる。
でも省略すると あえてNULL なのか ELSE部分の書き漏れバグ なのか コレガワカラナイ。
ELSE
は省略しない方がいいかなって思う。
注意点(返す型を揃えないと例外)
例えば下記は例外。
SELECT
CASE 数値型のカラム名
WHEN 1 THEN '1だよ'
ELSE 数値型のカラム名
END AS 判定結果カラムエイリアス名
FROM テーブル名
WHEN
に入った場合は文字列型が返る。
でも ELSE
に入った場合は数値型が返る。
数値型 ≠ 文字列型 なので例外。
注意点(誤ったNULL判定その1)
補足として、 SUBSTR(NULL, 1, 1)
の結果はNULL。
WHEN IS NULL
と書いてしまうパターン。
例えば下記は例外。
SELECT
CASE SUBSTR(NULL, 1, 1)
WHEN IS NULL THEN 'NULLだよ'
ELSE 'NULLじゃないよ'
END AS test
FROM テーブル名
注意点(誤ったNULL判定その2)
WHEN NULL
と書いてしまうパターン。
この場合、 例外にならない(Oracle側でストップがかからない)のでバグになる可能性大 で危険。
SELECT
CASE SUBSTR(NULL, 1, 1)
WHEN NULL THEN 'NULLだよ'
ELSE 'NULLじゃないよ'
END AS test
FROM テーブル名
NULL判定したい時
SELECT
CASE
WHEN SUBSTR(NULL, 1, 1) IS NULL THEN 'NULLだよ'
ELSE 'NULLじゃないよ'
END AS test
FROM テーブル名
CASEで判定するカラムの値がNULLの場合の補足
カラム名の値がNULLのレコードは『01じゃないよ』になる。
NULLは『01』ではないからELSE句の値が返る。
当たり前といっては当たり前だけど…。
SELECT
CASE カラム名
WHEN '01' THEN '01だよ'
ELSE '01じゃないよ'
END AS test
FROM テーブル名
単純なNULL置換をしたいだけなら
参考サイトさん
バージョン
Oracle Database 11g Release 11.2.0.1.0 - 64bit Production