★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

9.18. 条件式 #

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

ヒント

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

注記

COALESCEGREATESTLEASTは構文的には関数に似ていますが通常の関数ではなく、明示的なVARIADIC配列引数と一緒には使えません。

9.18.1. CASE #

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

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

CASE句は式が有効な位置であればどこでも使用可能です。 それぞれのconditionとはboolean型の結果を返す式です。 もしconditionの結果が真であれば、CASE式の値は、conditionに続くresultとなります。そして、CASE式の残りは処理されません。 もしconditionの結果が偽であれば後に続く全てのWHEN句が同じようにして調べられます。 WHENconditionの1つも真でない場合、CASE式の値はELSE句のresultになります。 ELSE句が省略され、どのconditionも真でない場合、結果は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

最初の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;

注記

4.2.14で説明したとおり、式の副式が異なる時点で評価される様々な状況があります。そのためCASEは必要な副式のみを評価するという原則は厳格なものではありません。 例えば、定数1/0副式は、実行時には決して入らないCASE節の中にあったとしても、通常は計画時にゼロによる除算での失敗という結果に終わります。

9.18.2. COALESCE #

COALESCE(value [, ...])

COALESCE関数は、NULLでない自身の最初の引数を返します。 全ての引数がNULLの場合にのみNULLが返されます。データを表示目的で取り出す際、NULL値をデフォルト値で置き換えるためによく使用されています。以下に例を示します。

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

これはdescriptionがNULLでなければそれを返します。 そうでない場合(NULLの場合)は、short_descriptionがNULLでなければそれを返します。 それ以外の場合(short_descriptionもNULLの場合)は(none)が返ります。

引数はすべて共通の型に変換できる必要があり、それが結果の型になります。(詳細は10.5を参照してください。)

CASE式同様、COALESCEは結果を決定するために必要な引数のみを評価します。つまり、非NULL引数が見つかれば、その右側にある引数は評価されません。 このSQL標準関数は、他のいくつかのデータベースで使用されているNVLおよびIFNULLと類似の機能を提供します。

9.18.3. NULLIF #

NULLIF(value1, value2)

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

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

この例では、value(none)ならばNULLが返ります。 さもなくばvalueを返します

2つの引数は比較可能な型でなければなりません。 具体的には、あたかもvalue1 = value2と書いたように比較されるので、適当な=演算子が使用できなければなりません。

結果は最初の引数と同じ型ですが、微妙な場合があります。 実際に返却されるのは=演算子が暗示する最初の引数で、場合によっては2番目の引数にマッチするように昇格されています。 たとえばNULLIF(1, 2.2)numericを出力します。なぜならinteger = numeric演算子はなく、numeric = numericがあるだけだからです。

9.18.4. GREATESTおよびLEAST #

GREATEST(value [, ...])
LEAST(value [, ...])

GREATESTLEAST関数は任意の数の式のリストから最大値もしくは最小値を選択します。 評価される全ての式は共通の型に変換できる必要があり、それが結果の型になります(詳細は10.5を参照してください)。

引数リストの中のNULL値は無視されます。 全ての式がNULLと評価された場合に限って結果はNULLになります。 (これはSQL標準からの逸脱です。 標準によれば、結果値は、いずれかの引数がNULLの場合はNULLになります。 他の一部のデータベースでは、このように動作します。)