CASE式

構文

case_expression ::= CASE 
   WHEN expression THEN expression 
   (WHEN expression THEN expression)* 
   [ELSE expression] 
   END

セマンティクス

検索されたCASE式は、従来のプログラミング言語のif-then-else文に似ています。これは、いくつかのWHEN-THENペアで構成され、末尾にオプションのELSE句が続きます。各WHEN式は条件です。つまり、BOOLEAN?を返す必要があります。THEN式およびELSE式は、項目の順序を返す場合があります。CASE式は、最初にWHEN式を上から下に評価して、最初にtrueを返すものまで評価されます。trueを返すのがi番目のWHEN式の場合、i番目のTHEN式が評価され、その結果はCASE式全体の結果になります。WHEN式でtrueが返されない場合、ELSEがあれば、その式が評価され、その結果がCASE式全体の結果となります。それ以外の場合、CASE式の結果は空の順序になります。

例6-47 CASE式

各ユーザーについて、ユーザーの姓、電話情報および$5000を超える支出カテゴリを記録する3つのフィールドを含むマップを作成します。

SELECT
{
    "last_name" : u.lastName,
    "phones" : CASE
        WHEN exists u.address.phones 
        THEN u.address.phones
        ELSE "Phone info absent or not at the expected place"
    END,
    "high_expenses" : [ u.expenses.keys($value > 5000) ]
}
FROM users u;

問合せは、配列およびマップ・コンストラクタのクエリによく似ています。唯一の違いは、電話フィールドの値を計算するためのCASE式の使用方法です。これにより、パス式u.address.phonesが空またはNULLを返す場合でも、電話フィールドが常に存在することが保証されます。ほとんどの場合u.address.phonesは配列を返すため、(high_expensesフィールドで行ったように)明示的な配列コンストラクタでパス式をラップすることはここでは適切な解決策ではなく、別の配列のみを含む追加の配列を作成する必要はありません。