メインコンテンツまでスキップ
に最終更新

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 を返します。

注記​

  1. ARRAY と、Doris 5.0.0 以降の VARIANT 配列のインデックスは 1 から始まります。0 からではありません。
  2. ARRAY と VARIANT 配列へのアクセスでは負のインデックスを使用できます。-1 は最後の要素、-2 は最後の一つ前の要素を表します。
  3. 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
  1. VARIANT では、クエリ内で計算された値に含まれる JSON の null メンバーにアクセスすると、VARIANT の null が返されます。これは SQL の NULL とは異なります。テーブルから読み取ったデータでは、配列外のオブジェクトに含まれる null メンバーは保存されないため、同じアクセスでも SQL の NULL が返されます。NULL のセマンティクスを参照してください。

使用例​

  1. 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 |
    +--------------+
  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 |
    +--------------------------+
  3. MAP に存在しないキーでアクセスすると NULL が返されます。

    SELECT ELEMENT_AT({"a": 1, "b": 2}, "c");
    +-----------------------------------+
    | ELEMENT_AT({"a": 1, "b": 2}, "c") |
    +-----------------------------------+
    | NULL |
    +-----------------------------------+
  4. 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 |
    +--------------------------------------------------+
  5. 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 |
    +-------------------------------------------+