フィールド・ステップ式
構文
map_field_step ::=
id
| string
| variable_reference
|
parenthesized_expression
| function_call
セマンティクス
フィールド・ステップの主な用途は、レコードまたはマップからフィールドの値を選択することです。選択するフィールドは、フィールド名で指定されます。フィールド名は、識別子として明示的に指定されるか、名前式で計算されます。名前式は、STRING?型である必要があります。
- コンテキスト項目がアトミック項目の場合、その項目はスキップされます(結果は空になります)。
- 名前式が計算されます。名前式は、$変数を介してコンテキスト項目を参照できます。名前式が空の順序またはNULLを返す場合、コンテキスト項目はスキップされます。それ以外の場合は、名前式の結果をKにします(名前式のかわりに識別子が使用される場合、Kは識別子と同じ文字の文字列です)。
- コンテキスト項目がレコードの場合、そのレコードにKという名前のフィールドが含まれていると、そのフィールドの値が返され、それ以外の場合はエラーが発生します。
- コンテキスト項目がマップの場合、そのマップにKという名前のフィールドが含まれていると、そのフィールドの値が返され、それ以外の場合は空の結果が返されます。
- コンテンツ項目が配列の場合、フィールド・ステップは配列の各要素に再帰的に適用されます(コンテキスト項目は現在の配列要素に設定されます)。
例6-22 フィールド・ステップ式
すべてのユーザーのidおよび都市を選択します。
SELECT id, u.address.city
FROM users u;
パス式への入力が表の列である場合、表の別名を列名とともに使用する必要があります。それ以外の場合は、変数参照の項で説明しているように、address.cityのような式は、addressという表のcity列への参照として解釈されます。これは正しくありません。
addressがJSON型の列であることを思い出してください。ほとんどの(すべてではない)ユーザーの場合、その値はjsonドキュメント、つまり他のjson値を含むマップになります。ドキュメントであり、cityというフィールドがある場合は、その値が返されます。cityフィールドのない住所ドキュメントの場合、パス式u.address.cityは空の順序を返し、これはSELECT句によってNULLに変換されます。アトミック値(フラット文字列など)である住所についても同様です。最後に、ユーザーはaddress列に配列として格納された多くの住所を持つことができます。そのようなユーザーの場合、そのユーザーのすべての都市が配列内で返されます。
注意:
問合せプロセッサは、問合せによって作成される個々のレコードに対して、オンザフライで正確なRECORD型を作成できますが、パフォーマンス上の理由からそうしていません。かわりに、返されるすべてのレコード項目に対して共通の型を作成します。例6-23 フィールド・ステップ式
カリフォルニア州に住むすべてのユーザーのidと書籍に費やした金額を選択します。
SELECT id, u.expenses.books
FROM users u
WHERE u.address.state = "CA";
この場合、expensesは型指定されたマップで、すべての値の型はINTEGERです。その結果、前述の問合せで作成されて返されるレコード項目の型はすべてRECORD(id INTEGER, books INTEGER)になります。
例6-24 フィールド・ステップ式
ユーザーごとに、idと住所のフィールドを選択します。選択するフィールドは外部変数で指定されます。
DECLARE $fieldName STRING;
SELECT u.id, u.address.$fieldName
FROM users u;
例6-25 フィールド・ステップ式
ユーザーごとに、すべての姓を選択します。この問合せでは、otherName列は配列であり、配列の各要素に.lastステップが適用されます。
SELECT lastName, u.otherNames.last
FROM users u;
例6-26 フィールド・ステップ式
ユーザーごとに、idとすべての電話番号(市外局番なし)を選択します。この問合せは、電話が電話オブジェクトの配列であるか、単一の電話オブジェクトであるかに関係なく、予期したとおりに機能します。ただし、電話が、たとえば、単一の整数または数値フィールドを持たないjsonオブジェクトの場合、パス式は空の順序を返し、これはSELECT句によってNULLに変換されます。
SELECT id, u.address.phones.number
FROM users u;
例6-27 フィールド・ステップ式
都道府県ごとに、その都道府県の人々が書籍に費やした金額を調べます。
SELECT u.address.state, sum(u.expenses.books)
FROM users u
GROUP BY u.address.state;
前述の問合せが機能するには、最初のフィールドがu.address.stateの索引が存在する必要があります。