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アーム内にあったとしても、計画時には通常ゼロ除算の失敗となる。

コメントを残す

メールアドレスが公開されることはありません。