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-93 各ユーザーについて、ユーザーの姓、電話情報および$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
問合せは、配列およびマップ・コンストラクタのクエリによく似ています。唯一の違いは、phones
フィールドの値を計算するためのCASE式の使用方法です。これにより、パス式u.address.phones
が空またはNULLを返す場合でも、電話フィールドが常に存在することが保証されます。ほとんどの場合u.address.phones
は配列を返すため、(high_expensesフィールドで行ったように)明示的な配列コンストラクタでパス式をラップすることはここでは適切な解決策ではなく、別の配列のみを含む追加の配列を作成する必要はありません。
JSONコレクション表:
{"contactPhone":"1917113999","address":{"city":"San Jose","number":501,"state":"San Francisco","street":"Maine","zip":95095},"cart":[{"item":"wallet","priceperunit":950,"quantity":2},{"item":"wall art","priceperunit":9500,"quantity":1}],"firstName":"Sharon","gender":"F","lastName":"Willard","notify":"yes","wishlist":[{"item":"Tshirt","priceperunit":500},{"item":"Jenga","priceperunit":850}]}
例6-94 カートに財布またはハンドバッグのアイテムが入っているサンノゼの買物客へのプロモーション・メッセージの表示
SELECT concat("Hi ",s.firstName) AS Message,
CASE
WHEN s.cart.item =any "wallet"
THEN "The prices on Wallets have dropped"
WHEN s.cart.item =any "handbag"
THEN "The prices on handbags have dropped"
ELSE "Exciting offers on wallets and handbags"
END AS Offer
FROM storeAcct s
WHERE s.address.city =any "San Jose"
説明: CASE文を使用すると、買物客のカートにwallet
またはhandbag
アイテムがある場合に、価格の割引に関するプロモーション・メッセージを買物客に表示できます。このオファーはSan Jose
の買物客にのみ提供されるため、WHERE句で市区町村を指定します。
{"Message":"Hi Sharon","Offer":"The prices on Wallets have
dropped"}