1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

OracleでCASE文(条件分岐、if)

Last updated at Posted at 2022-08-08

やり方(シンプル)

特定カラムの値が〇〇だったら××、それ以外は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 は省略しない方がいいかなって思う。

注意点(返す型を揃えないと例外)

例えば下記は例外。

ORA-00932の例外になるSQL
SELECT 
    CASE 数値型のカラム名
        WHEN 1 THEN '1だよ'
        ELSE 数値型のカラム名
    END AS 判定結果カラムエイリアス名
FROM テーブル名

WHEN に入った場合は文字列型が返る。
でも ELSE に入った場合は数値型が返る。
数値型 ≠ 文字列型 なので例外。

注意点(誤ったNULL判定その1)

補足として、 SUBSTR(NULL, 1, 1) の結果はNULL。

WHEN IS NULL と書いてしまうパターン。

例えば下記は例外。

ORA-00932の例外になる誤ったSQL
SELECT 
    CASE SUBSTR(NULL, 1, 1) 
        WHEN IS NULL THEN 'NULLだよ' 
        ELSE 'NULLじゃないよ'
    END AS test
FROM テーブル名 

注意点(誤ったNULL判定その2)

WHEN NULL と書いてしまうパターン。
この場合、 例外にならない(Oracle側でストップがかからない)のでバグになる可能性大 で危険。

必ず『NULLじゃないよ』の結果になってしまう誤ったSQL
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

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?