配列およびマップ・コンストラクタ

構文

array_constructor ::= 
   "[" expression ("," expression)* "]"

map_constructor ::= 
   ("{" expression ":" expression 
   ("," expression ":" expression)* "}") | 
   ("{" "}")

セマンティクス

配列コンストラクタは、大カッコ内の式によって返された項目から新しい配列を作成します。これらの式は左から右に計算され、生成された項目は配列に追加されます。入力式で生成されたNULLはすべてスキップされます(配列にNULLを含めることはできません)。

同様に、マップ・コンストラクタは、中カッコ内の式によって返された項目から新しいマップを作成します。これらの式はペアになっていて、それぞれのペアによって1つのフィールドが計算されます。ペアの最初の式は、フィールドの名前として機能する最大1つの文字列を返す必要があり、2番目の式は関連付けられたフィールド値を返します。値式が複数の項目を返す場合、項目を格納するための配列が暗黙的に作成され、その配列がフィールド値になります。フィールド名またはフィールド値式が空の順序を返す場合、フィールドは作成されません。フィールドの計算された名前または値がNULLの場合、そのフィールドはスキップされます(マップにNULLを含めることはできません)。

作成される配列またはマップの型は、問合せのコンパイル中に、入力式の型およびコンストラクタ式の使用方法に基づいて決定されます。具体的には、作成された配列またはマップが別の作成された配列またはマップに挿入され、この親の配列/マップの型がARRAY(JSON)またはMAP(JSON)の場合、子の配列/マップの型もARRAY(JSON)またはMAP(JSON)になります。これは、型指定されたデータがJSONデータ内で許可されないという制限を強制するためです(データ型の階層を参照)。

例6-46 配列およびマップ・コンストラクタ

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

SELECT
{
    "last_name" : u.lastName,
    "phones" : u.address.phones,
    "high_expenses" : [ u.expenses.keys($value > 5000) ]
}
FROM users u;

high_expensesフィールドに明示的配列を使用すると、配列コンストラクタ内部のパスが空を返す場合でも、作成されたすべてのマップにそのフィールドが存在することが保証されます。また、作成される配列のすべての要素が文字列であることはコンパイル時にわかっていますが、JSONマップに挿入されるため、配列はARRAY(JSON)型(ARRAY(STRING)ではなく)で作成されることに注意してください。