本節ではPostgreSQLで使用可能なSQL準拠の条件式について説明します。
ティップ: ここで説明する条件式より発展した機能を求める場合は、より表現の豊富なプログラム言語でストアドプロシージャを記述することで解決されます。
SQLのCASE式は他の言語のif/else構文に類似した汎用条件式です。
CASE WHEN condition THEN result [WHEN ...] [ELSE result] END
CASE句は式が有効な位置であればどこでも使用可能です。conditionとはboolean型の結果を返す式です。もし結果が真であればCASE式の値はresultとなります。もし結果が偽であれば同じようにして後に続くWHEN句が調べられます。WHENのconditionの1つも真でない場合、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
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;
COALESCE
(value [, ...])
COALESCE
関数は、NULLでない自身の最初の引数を返します。全ての引数がNULLの場合にのみNULLが返されます。データを表示の目的で取り出す際、NULL値の代わりにデフォルト値が使用されます。以下に例を示します。
SELECT COALESCE(description, short_description, '(none)') ...
CASE式同様、COALESCE
は結果を決定するために必要でない引数を評価しません。つまり、非NULL引数が見つかれば、その右側にある引数は評価されません。このSQL標準関数はNVL
とIFNULL
と類似の機能を提供し、他のいくつかのデータベースシステムで使用されています。
NULLIF
(value1, value2)
NULLIF
関数は、value1とvalue2が等しい場合、NULL値を返します。
その他の場合はvalue1を返します。
これを使って、上記のCOALESCE
の例の逆演算を実行できます
SELECT NULLIF(value, '(none)') ...
value1が(none)ならばNULLを返します。 さもなくばvalue1を返します。
GREATEST
(value [, ...])
LEAST
(value [, ...])
GREATEST
とLEAST
関数は数値がいくらあっても、その中から最大値もしくは最小値を選択します。評価される全ての数値は、結果として得られるデータの型と共通の型に変換できなくてはなりません(詳細は項10.5を参照してください)。リストの中のNULL値は無視されます。全ての値がNULLと評価された場合に限って結果はNULLになります。
GREATEST
およびLEAST
はSQL標準に載っていませんが、共通した拡張です。他のいくつかのデータベースでは、全てがNULLの場合に限定せず、いずれかの引数がNULLである場合にNULLを返すようにしているものもあります。