9.12. 条件式

この節ではPostgreSQLで使用可能なSQL準拠の条件式について説明します。

ティップ: ここで説明する条件式より発展した機能を求める場合は、より表現の豊富なプログラム言語でストアドプロシージャを記述することで解決されます。

9.12.1. CASE

SQLCASE式は他の言語のif/else構文に類似した汎用条件式です。

CASE WHEN condition THEN result
     [WHEN ...]
     [ELSE result]
END

CASE句は式が有効な位置であればどこでも使用可能です。 conditionとはboolean型の結果を返す式です。 もし結果が真であれば CASE式の値はresultとなります。 もし結果が偽であれば同じようにして後に続くWHEN句が調べられます。 WHENconditionのひとつも真でない場合、CASE式の値はELSE句のresultになります。 ELSE句が無く、どの条件とも一致しない場合、結果はNULLです。

以下に例を示します。

SELECT * FROM test;

 a
---
 1
 2
 3


SELECT a,
       CASE WHEN a=1 THEN 'one'
            WHEN a=2 THEN 'two'
            ELSE 'other'
       END
    FROM test;

 a | case
---+-------
 1 | one
 2 | two
 3 | other

すべてのresult式のデータ型は単一の出力型に互換性がなければなりません。 詳細は項10.5を参照ください。

以下の"簡略形"CASE式は上に記述した一般形式からの特別な変形です。

CASE expression
    WHEN value THEN result
    [WHEN ...]
    [ELSE result]
END

The expressionは計算され、等しいものが見つかるまでWHEN句で指定されたすべてのvalueと比較されます。 等しいものが見つからない場合、ELSE句のresult(もしくはNULL値)が返されます。 これはC言語のswitch文に似ています。

上の例は簡略形CASE構文を使って次のように書くことができます。

SELECT a,
       CASE a WHEN 1 THEN 'one'
              WHEN 2 THEN 'two'
              ELSE 'other'
       END
    FROM test;

 a | case
---+-------
 1 | one
 2 | two
 3 | other

CASE式は、結果を決定するために必要ではない副式を全く評価しません。 例えば、以下は0除算エラーを防ぐための方法です。

SELECT ... WHERE CASE WHEN x <> 0 THEN y/x > 1.5 ELSE false END;

9.12.2. COALESCE

COALESCE(value [, ...])

COALESCE関数は、NULLでない自身の最初の引数を返します。 すべての引数がNULLの場合にのみNULLが返されます。 データを表示の目的で取り出す際、NULL値の代わりにデフォルト値を使う場合、時として便利なことがあります。 以下に例を示します。

SELECT COALESCE(description, short_description, '(none)') ...

CASE式同様、COALESCEは結果を決定するために必要でない引数を評価しません。 つまり、非NULL引数が見つかれば、その右側にある引数は評価されません。

9.12.3. NULLIF

NULLIF(value1, value2)

NULLIF関数は、value1value2が等しい場合、またその場合に限ってのみ、NULL値を返します。 その他の場合はvalue1を返します。 これを使って、上記のCOALESCEの例の逆演算を実行できます。

SELECT NULLIF(value, '(none)') ...