カテゴリ:

半構造化データ関数と構造化データ関数 (抽出)

GET_PATH、 :

パス名を使用して半構造化データから値を抽出します。

GET_PATH は、 GET のバリエーションです。最初の引数として VARIANTOBJECT、または ARRAY 列名を取り、2番目の引数として提供されたパス名に従ってフィールドまたは要素の値を抽出します。

構文

GET_PATH( <column_identifier> , '<path_name>' )

<column_identifier>:<path_name>

:( <column_identifier> , '<path_name>' )
Copy

引数

column_identifier

VARIANT、 OBJECT、 ARRAY 列に評価される式。

path_name

VARCHAR 値として評価される式。この値は、抽出したいフィールドまたは要素へのパスを指定します。

構造化型 の場合は、文字列定数を指定する必要があります。

戻り値

  • 戻り値は、 ARRAY の指定された要素、または OBJECT にあるキーと値のペアの指定されたキーに対応する値です。

  • 入力オブジェクトが半構造化 OBJECT、 ARRAY、 VARIANT 値の場合、関数は VARIANT 値を返します。次の理由のため、値のデータ型は VARIANT です。

    • ARRAY の値では、各要素のタイプは VARIANT です。

    • OBJECT の値では、各キーと値のペアの値は VARIANT のタイプです。

  • 入力オブジェクトが 構造化 OBJECT、構造化 ARRAY、または MAP の場合、関数はオブジェクトに指定された型の値を返します。

    例えば、入力オブジェクトのタイプが ARRAY(NUMBER) の場合、関数は NUMBER の値を返します。

使用上の注意

  • GET_PATH は、 GET 関数のチェーンと同等です。パス名がどの要素にも該当しない場合は NULL を返します。

  • パス名の構文は、標準的な JavaScript 表記法です。フィールド名(識別子)の前にピリオド(例: .)とインデックス演算子(例: [<インデックス >])を連結したものです。

    • 最初のフィールド名では、先頭のピリオドを指定する必要はありません。

    • インデックス演算子のインデックス値は、負でない10進数(配列の場合)または一重引用符または二重引用符で囲まれた文字列リテラル(オブジェクトフィールドの場合)です。

    詳細については、 半構造化データのクエリ をご参照ください。

  • GET_PATH は、 : 文字を抽出演算子として使用し、列名(ピリオドを含むことも可能)とパス指定子を分離する構文的なショートカットもサポートしています。

    構文の一貫性を維持するために、パス表記は SQL スタイルの二重引用符で囲まれた識別子もサポートし、パス区切り文字として : を使用します。

    : 演算子を使用すると、整数または文字列の部分式を [] 内に含めることができます。

VARIANT 列を含むテーブルを作成し、データを挿入します。 PARSE_JSON 関数を使用して、 VARIANT データを挿入します。VARIANT 値には、ネストされた ARRAY 値と OBJECT 値が含まれます。

CREATE OR REPLACE TABLE get_path_demo(
  id INTEGER,
  v  VARIANT);

INSERT INTO get_path_demo (id, v)
  SELECT 1,
         PARSE_JSON('{
           "array1" : [
             {"id1": "value_a1", "id2": "value_a2", "id3": "value_a3"}
           ],
           "array2" : [
             {"id1": "value_b1", "id2": "value_b2", "id3": "value_b3"}
           ],
           "object_outer_key1" : {
             "object_inner_key1a": "object_x1",
             "object_inner_key1b": "object_x2"
           }
         }');

INSERT INTO get_path_demo (id, v)
  SELECT 2,
         PARSE_JSON('{
           "array1" : [
             {"id1": "value_c1", "id2": "value_c2", "id3": "value_c3"}
           ],
           "array2" : [
             {"id1": "value_d1", "id2": "value_d2", "id3": "value_d3"}
           ],
           "object_outer_key1" : {
             "object_inner_key1a": "object_y1",
             "object_inner_key1b": "object_y2"
           }
         }');

SELECT * FROM get_path_demo;
Copy
+----+----------------------------------------+
| ID | V                                      |
|----+----------------------------------------|
|  1 | {                                      |
|    |   "array1": [                          |
|    |     {                                  |
|    |       "id1": "value_a1",               |
|    |       "id2": "value_a2",               |
|    |       "id3": "value_a3"                |
|    |     }                                  |
|    |   ],                                   |
|    |   "array2": [                          |
|    |     {                                  |
|    |       "id1": "value_b1",               |
|    |       "id2": "value_b2",               |
|    |       "id3": "value_b3"                |
|    |     }                                  |
|    |   ],                                   |
|    |   "object_outer_key1": {               |
|    |     "object_inner_key1a": "object_x1", |
|    |     "object_inner_key1b": "object_x2"  |
|    |   }                                    |
|    | }                                      |
|  2 | {                                      |
|    |   "array1": [                          |
|    |     {                                  |
|    |       "id1": "value_c1",               |
|    |       "id2": "value_c2",               |
|    |       "id3": "value_c3"                |
|    |     }                                  |
|    |   ],                                   |
|    |   "array2": [                          |
|    |     {                                  |
|    |       "id1": "value_d1",               |
|    |       "id2": "value_d2",               |
|    |       "id3": "value_d3"                |
|    |     }                                  |
|    |   ],                                   |
|    |   "object_outer_key1": {               |
|    |     "object_inner_key1a": "object_y1", |
|    |     "object_inner_key1b": "object_y2"  |
|    |   }                                    |
|    | }                                      |
+----+----------------------------------------+

各行の array2 から id3 の値を抽出します。

SELECT id,
       GET_PATH(
         v,
         'array2[0].id3') AS id3_in_array2
  FROM get_path_demo;
Copy
+----+---------------+
| ID | ID3_IN_ARRAY2 |
|----+---------------|
|  1 | "value_b3"    |
|  2 | "value_d3"    |
+----+---------------+

: 演算子を使用して、各行の array2 から同じ id3 の値を抽出します。

SELECT id,
       v:array2[0].id3 AS id3_in_array2
  FROM get_path_demo;
Copy
+----+---------------+
| ID | ID3_IN_ARRAY2 |
|----+---------------|
|  1 | "value_b3"    |
|  2 | "value_d3"    |
+----+---------------+

この例は前の例と同じですが、 SQL 形式の二重引用符で囲まれた識別子を使用しています。

SELECT id,
       v:"array2"[0]."id3" AS id3_in_array2
  FROM get_path_demo;
Copy
+----+---------------+
| ID | ID3_IN_ARRAY2 |
|----+---------------|
|  1 | "value_b3"    |
|  2 | "value_d3"    |
+----+---------------+

各行のネストされた OBJECT 値から object_inner_key1a の値を抽出します。

SELECT id,
       GET_PATH(
         v,
         'object_outer_key1:object_inner_key1a') AS object_inner_key1A_values
  FROM get_path_demo;
Copy
+----+---------------------------+
| ID | OBJECT_INNER_KEY1A_VALUES |
|----+---------------------------|
|  1 | "object_x1"               |
|  2 | "object_y1"               |
+----+---------------------------+

: 演算子を使用して、同じ object_inner_key1a の値を抽出します。

SELECT id,
       v:object_outer_key1.object_inner_key1a AS object_inner_key1a_values
  FROM get_path_demo;
Copy
+----+---------------------------+
| ID | OBJECT_INNER_KEY1A_VALUES |
|----+---------------------------|
|  1 | "object_x1"               |
|  2 | "object_y1"               |
+----+---------------------------+

この例は前の例と同じですが、 SQL 形式の二重引用符で囲まれた識別子を使用しています。

SELECT id,
       v:"object_outer_key1":"object_inner_key1a" AS object_inner_key1a_values
  FROM get_path_demo;
Copy
+----+---------------------------+
| ID | OBJECT_INNER_KEY1A_VALUES |
|----+---------------------------|
|  1 | "object_x1"               |
|  2 | "object_y1"               |
+----+---------------------------+