9.17.1. CASE
SQL CASE式は、他のプログラミング言語におけるif/else文と同様に、汎用的な条件式です。
CASE WHEN condition THEN result END
CASE句は式が有効であればどこでも使用することができます。 各条件は、ブール値の結果を返す式です。 条件の結果が真であれば、CASE式の値は条件に続く結果となり、CASE式の残りの部分は処理されない。 条件の結果がtrueでない場合、それ以降のWHEN句は同じ方法で検査されます。 WHEN条件が真にならない場合、CASE式の値はELSE句の結果となる。 ELSE句が省略され、どの条件も真でない場合、結果はNULLです。
例:
SELECT * FROM test; a--- 1 2 3SELECT 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
すべての結果式のデータ型は、単一の出力型に変換可能でなければなりません。
CASE 式の「単純な」形式は、上記の一般的な形式を変形したものです:
CASE expression WHEN value THEN result END
最初の式が計算され、それと同じものが見つかるまで WHEN 節の各値式と比較されます。 一致するものがない場合、ELSE句の結果(または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 式は、結果を決定するために必要ない部分式は評価されません。 例えば、これはゼロ除算の失敗を避けるために考えられる方法である:
SELECT ... WHERE CASE WHEN x <> 0 THEN y/x > 1.5 ELSE false END;
注意:4.2.14節で述べたように、式の部分式が異なる時間に評価される様々な状況があり、「CASEは必要な部分式のみを評価する」という原則は鉄壁とは言えない。 例えば定数1/0の部分式は、実行時には決して入力されないであろうCASEアーム内にあったとしても、計画時には通常ゼロ除算の失敗となる。
。