カテゴリ:

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

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" | +----+---------------------------+