- カテゴリ:
半構造化データ関数と構造化データ関数 (抽出)
GET_PATH、 :
¶
パス名を使用して半構造化データから値を抽出します。
GET_PATH は、 GET のバリエーションです。最初の引数として VARIANT、 OBJECT、または ARRAY 列名を取り、2番目の引数として提供されたパス名に従ってフィールドまたは要素の値を抽出します。
構文¶
GET_PATH( <column_identifier> , '<path_name>' )
<column_identifier>:<path_name>
:( <column_identifier> , '<path_name>' )
引数¶
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;
+----+----------------------------------------+
| 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;
+----+---------------+
| 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;
+----+---------------+
| 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;
+----+---------------+
| 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;
+----+---------------------------+
| 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;
+----+---------------------------+
| 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;
+----+---------------------------+
| ID | OBJECT_INNER_KEY1A_VALUES |
|----+---------------------------|
| 1 | "object_x1" |
| 2 | "object_y1" |
+----+---------------------------+