マップフィルタ・ステップ式
構文
map_filter_step ::= (KEYS | VALUES) "(" [expression
] ")"
セマンティクス
フィールド・ステップと同様、マップフィルタ・ステップは、主にレコードおよびマップに使用します。マップフィルタ・ステップでは、フィールド名(キー)または指定した条件を満たすマップ/レコード・フィールドのフィールド値(カッコ内の述語式として指定)を選択します。述語式がない場合は、定数trueとみなされます(この場合、すべてのフィールド名またはすべてのフィールド値が返されます)。
マップ・フィルタ・ステップでは、各コンテキスト項目が次のように処理されます。
- コンテキスト項目がアトミック項目の場合、その項目はスキップされます(結果は空になります)。
- コンテキスト項目がレコードまたはマップの場合、ステップはそのフィールドを反復処理します。各フィールドの述語式が計算されます。コンテキスト項目変数($)の他に、述語式では2つの暗黙的に宣言された変数を参照できます。$keyはコンテキスト・フィールド($の現在のフィールド)の名前にバインドされます。$valueはコンテキスト・フィールドの値にバインドされます。述語式はBOOLEAN式ある必要があります?。述語式のNULLまたは空の結果は、false値として扱われます。述語の結果がtrueの場合、コンテキスト・フィールドが選択され、その名前または値が返されます。それ以外の場合、コンテキスト・フィールドはスキップされます。
- コンテキスト項目が配列の場合、マップフィルタ・ステップは配列の各要素に再帰的に適用されます(現在の配列要素に設定されているコンテキスト項目を使用)。
例6-28 マップフィルタ・ステップ式
ユーザーごとに、IDとそのユーザーが$1000を超えて支出した費用カテゴリを選択します。
SELECT id, u.expenses.keys($value > 1000)
FROM users u;
例6-29 マップフィルタ・ステップ式
ユーザーごとに、IDとそのユーザーが衣料品よりも多く支出した費用カテゴリを選択します。この問合せでは、フィルタ・ステップ式[$value > $.clothes]に表示されるコンテキスト項目変数($)は、そのフィルタ・ステップのコンテキスト項目を指します。つまり、費用マップ全体を指します。
SELECT id, u.expenses.keys($value > $.clothes)
FROM users u;
例6-30 マップフィルタ・ステップ式
ユーザーごとに、ID、住宅を除くすべてのカテゴリの費用合計、およびこれらの費用の最大値を選択します。
SELECT id,
seq_sum(u.expenses.values($key != housing)) AS sum,
seq_max(u.expenses.values($key != housing)) AS max
FROM users u;
例6-31 マップフィルタ・ステップ式
フィールド・ステップは、実際にはマップフィルタ・ステップの特殊なケースであることに注意してください。たとえば、次の問合せを見てみます
SELECT id, u.address.city
FROM users u;
これは、次と同じです SELECT id, u.address.values($key = "city")
FROM users u;
ただし、パフォーマンス上の理由から、フィールド・ステップ・バージョンが優先されます。