フィールド・ステップ式

セマンティクス

フィールド・ステップの主な用途は、レコードまたはマップからフィールドの値を選択することです。選択するフィールドは、フィールド名で指定されます。フィールド名は、識別子として明示的に指定されるか、名前式で計算されます。名前式は、STRING?型である必要があります。

フィールド・ステップでは、各コンテキスト項目は次のように処理されます。
  • コンテキスト項目がアトミック項目の場合、その項目はスキップされます(結果は空になります)。
  • 名前式が計算されます。名前式は、$変数を介してコンテキスト項目を参照できます。名前式が空の順序またはNULLを返す場合、コンテキスト項目はスキップされます。それ以外の場合は、名前式の結果をKにします(名前式のかわりに識別子が使用される場合、Kは識別子と同じ文字の文字列です)。
  • コンテキスト項目がレコードの場合、そのレコードにKという名前のフィールドが含まれていると、そのフィールドの値が返され、それ以外の場合はエラーが発生します。
  • コンテキスト項目がマップの場合、そのマップにKという名前のフィールドが含まれていると、そのフィールドの値が返され、それ以外の場合は空の結果が返されます。
  • コンテンツ項目が配列の場合、フィールド・ステップは配列の各要素に再帰的に適用されます(コンテキスト項目は現在の配列要素に設定されます)。

例6-14 フィールド・ステップ式

すべてのユーザーの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(id INTEGER, city JSON)になります。このレコード・タイプのcityフィールドはJSON型です。これは、address列がJSON型であるため、結果として、住所のネストされたフィールドが有効なJSON値を持つことができるためです。ただし、結果の実際のレコード値ごとに、フィールド値がより詳細な型(ほとんどの場合STRING)のcityフィールドがあります。

注意:

問合せプロセッサは、問合せによって作成される個々のレコードに対して、オンザフライで正確なRECORD型を作成できますが、パフォーマンス上の理由からそうしていません。かわりに、返されるすべてのレコード項目に対して共通の型を作成します。

例6-15 フィールド・ステップ式

カリフォルニア州に住むすべてのユーザーのidと書籍に費やした金額を選択します。

SELECT id, u.expenses.books
FROM users u
WHERE u.address.state = "CA";

この場合、expensesは型指定されたマップで、すべての値の型はINTEGERです。その結果、前述の問合せで作成されて返されるレコード項目の型はすべてRECORD(id INTEGER, books INTEGER)になります。

例6-16 フィールド・ステップ式

ユーザーごとに、idと住所のフィールドを選択します。選択するフィールドは外部変数で指定されます。

DECLARE $fieldName STRING;

SELECT u.id, u.address.$fieldName
FROM users u;

例6-17 フィールド・ステップ式

ユーザーごとに、すべての姓を選択します。この問合せでは、otherName列は配列であり、配列の各要素に.lastステップが適用されます。

SELECT lastName, u.otherNames.last
FROM users u;

例6-18 フィールド・ステップ式

ユーザーごとに、idとすべての電話番号(市外局番なし)を選択します。この問合せは、電話が電話オブジェクトの配列であるか、単一の電話オブジェクトであるかに関係なく、予期したとおりに機能します。ただし、電話が、たとえば、単一の整数または数値フィールドを持たないjsonオブジェクトの場合、パス式は空の順序を返し、これはSELECT句によってNULLに変換されます。

SELECT id, u.address.phones.number
FROM users u;

例6-19 フィールド・ステップ式

都道府県ごとに、その都道府県の人々が書籍に費やした金額を調べます。

SELECT u.address.state, sum(u.expenses.books)
FROM users u
GROUP BY u.address.state;

前述の問合せが機能するには、最初のフィールドがu.address.stateの索引が存在する必要があります。