に最終更新
ELEMENT_AT
機能
ELEMENT_AT 関数は、指定したインデックスまたはキーに基づいて、配列、マップ、構造体、または VARIANT から要素の値を取り出します。
- ARRAY に適用すると、指定した位置の要素を返します。
- MAP に適用すると、指定したキーに対応する値を返します。
- STRUCT に適用すると、指定した位置(1 から開始)またはフィールド名のサブフィールドを返します。これは
STRUCT_ELEMENTと同じ動作です。 - VARIANT に適用すると、指定したサブフィールドの値を返します。
構文
ELEMENT_AT(container, key_or_index)
引数
container:ARRAY、MAP、STRUCT、VARIANTのいずれかです。key_or_index:ARRAYの場合: 整数です。インデックスは 1 から始まります。MAPの場合: キーの型(K)には、MAPでサポートされる任意のプリミティブ型を使用できます。STRUCTの場合: 1 から始まるフィールド位置を表す定数の整数、またはフィールド名を表す定数の文字列です。フィールド名の照合では大文字と小文字を区別しません。VARIANTオブジェクトへのアクセスの場合: 文字列のキーです。- Doris 5.0.0 以降で VARIANT 配列にアクセスする場合: 整数のインデックスです。正のインデックスは 1 から始まり、負のインデックスは末尾から数えます。
戻り値
ARRAYの場合: 指定したインデックスの要素(型はT)を返します。MAPの場合: 指定したキーに対応する値(型はV)を返します。STRUCTの場合: 指定したサブフィールドの値を返します。VARIANTの場合:VARIANT型の値を返します。存在しないキー、インデックス0、範囲外のインデックス、配列に対する文字列キー、オブジェクトに対する整数インデックス、スカラー値に対するキーは、いずれもNULLを返します。- インデックスまたはキーが存在しない場合は
NULLを返します(STRUCTでは、範囲外の位置や存在しないフィールド名を指定するとエラーになります)。 - 引数が
NULLの場合はNULLを返します。
注記
- ARRAY と、Doris 5.0.0 以降の VARIANT 配列のインデックスは 1 から始まります。0 からではありません。
- ARRAY と VARIANT 配列へのアクセスでは負のインデックスを使用できます。
-1は最後の要素、-2は最後の一つ前の要素を表します。 ELEMENT_AT(container, key_or_index)関数はcontainer[key_or_index]と同じ動作です(詳しくは使用例を参照してください)。
SELECT ELEMENT_AT(parse_to_variant('[10, 20, 30]'), 1); -- 10
SELECT ELEMENT_AT(parse_to_variant('[10, 20, 30]'), 2); -- 20
SELECT ELEMENT_AT(parse_to_variant('[10, 20, 30]'), -1); -- 30
VARIANTでは、クエリ内で計算された値に含まれる JSON のnullメンバーにアクセスすると、VARIANT のnullが返されます。これは SQL のNULLとは異なります。テーブルから読み取ったデータでは、配列外のオブジェクトに含まれるnullメンバーは保存されないため、同じアクセスでも SQL のNULLが返されます。NULL のセマンティクスを参照してください。
使用例
-
ELEMENT_AT関数は[]と同じ動作です。SELECT ELEMENT_AT([1, 2, 3], 2);
+--------------------------+
| ELEMENT_AT([1, 2, 3], 2) |
+--------------------------+
| 2 |
+--------------------------+
SELECT [1, 2, 3][2];
+--------------+
| [1, 2, 3][2] |
+--------------+
| 2 |
+--------------+ -
配列のインデックスは 1 から始まります。範囲外の位置にアクセスすると
NULLが返されます。SELECT ELEMENT_AT([1, 2, 3], 0);
+--------------------------+
| ELEMENT_AT([1, 2, 3], 0) |
+--------------------------+
| NULL |
+--------------------------+
SELECT ELEMENT_AT([1, 2, 3], 4);
+--------------------------+
| ELEMENT_AT([1, 2, 3], 4) |
+--------------------------+
| NULL |
+--------------------------+ -
MAPに存在しないキーでアクセスするとNULLが返されます。SELECT ELEMENT_AT({"a": 1, "b": 2}, "c");
+-----------------------------------+
| ELEMENT_AT({"a": 1, "b": 2}, "c") |
+-----------------------------------+
| NULL |
+-----------------------------------+ -
STRUCTのサブフィールドに位置またはフィールド名でアクセスします(STRUCT_ELEMENTと同じ動作です)。SELECT ELEMENT_AT(NAMED_STRUCT('name', 'Jack', 'id', 1728923), 1);
+------------------------------------------------------------+
| ELEMENT_AT(NAMED_STRUCT('name', 'Jack', 'id', 1728923), 1) |
+------------------------------------------------------------+
| Jack |
+------------------------------------------------------------+
SELECT NAMED_STRUCT('name', 'Jack', 'id', 1728923)['id'];
+--------------------------------------------------+
| NAMED_STRUCT('name', 'Jack', 'id', 1728923)['id'] |
+--------------------------------------------------+
| 1728923 |
+--------------------------------------------------+ -
VARIANTのサブフィールドにアクセスするとき、VARIANTの値が OBJECT でなければNULLが返されます。SELECT ELEMENT_AT(PARSE_TO_VARIANT('{"a": 1, "b": 2}'), "a");
+-------------------------------------------------------+
| ELEMENT_AT(PARSE_TO_VARIANT('{"a": 1, "b": 2}'), "a") |
+-------------------------------------------------------+
| 1 |
+-------------------------------------------------------+
SELECT ELEMENT_AT(PARSE_TO_VARIANT('123'), "");
+-------------------------------------------+
| ELEMENT_AT(PARSE_TO_VARIANT('123'), "") |
+-------------------------------------------+
| NULL |
+-------------------------------------------+