本節ではPostgreSQLで使用可能なSQL準拠の条件式について説明します。
ここで説明する条件式より発展した機能を求める場合は、より表現の豊富なプログラム言語でストアドプロシージャを記述することで解決されます。
COALESCE
、GREATEST
、LEAST
は構文的には関数に似ていますが通常の関数ではなく、明示的なVARIADIC
配列引数と一緒には使えません。
CASE
#
SQLのCASE
式は他のプログラミング言語のif/else構文に類似した汎用条件式です。
CASE WHENcondition
THENresult
[WHEN ...] [ELSEresult
] END
CASE
句は式が有効な位置であればどこでも使用可能です。
それぞれのcondition
とはboolean
型の結果を返す式です。
もしconditionの結果が真であれば、CASE
式の値は、conditionに続くresult
となります。そして、CASE
式の残りは処理されません。
もしconditionの結果が偽であれば後に続く全てのWHEN
句が同じようにして調べられます。
WHEN
のcondition
の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
式の「単純な」形式が存在します。
CASEexpression
WHENvalue
THENresult
[WHEN ...] [ELSEresult
] 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
節の中にあったとしても、通常は計画時にゼロによる除算での失敗という結果に終わります。
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
と類似の機能を提供します。
NULLIF
#NULLIF
(value1
,value2
)
NULLIF
関数は、value1
がvalue2
と等しい場合、NULL値を返します。
その他の場合はvalue1
を返します。
これを使って、上記のCOALESCE
の例の逆演算を実行できます
SELECT NULLIF(value, '(none)') ...
この例では、value
が(none)
ならばNULLが返ります。
さもなくばvalue
を返します
2つの引数は比較可能な型でなければなりません。
具体的には、あたかも
と書いたように比較されるので、適当なvalue1
= value2
=
演算子が使用できなければなりません。
結果は最初の引数と同じ型ですが、微妙な場合があります。
実際に返却されるのは=
演算子が暗示する最初の引数で、場合によっては2番目の引数にマッチするように昇格されています。
たとえばNULLIF(1, 2.2)
はnumeric
を出力します。なぜならinteger
=
numeric
演算子はなく、numeric
=
numeric
があるだけだからです。
GREATEST
およびLEAST
#GREATEST
(value
[, ...])
LEAST
(value
[, ...])
GREATEST
とLEAST
関数は任意の数の式のリストから最大値もしくは最小値を選択します。
評価される全ての式は共通の型に変換できる必要があり、それが結果の型になります(詳細は10.5を参照してください)。
引数リストの中のNULL値は無視されます。 全ての式がNULLと評価された場合に限って結果はNULLになります。 (これはSQL標準からの逸脱です。 標準によれば、結果値は、いずれかの引数がNULLの場合はNULLになります。 他の一部のデータベースでは、このように動作します。)