- 类别:
半结构化和结构化数据函数 (提取)
GET_PATH、:
¶
使用路径名从半结构化数据中提取值。
GET_PATH 是 GET 的变体;它将 VARIANT、OBJECT 或 ARRAY 列名用作第一个实参,并根据作为第二个实参提供的路径名提取字段或元素的值。
语法¶
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 表示法;它由字段名称(标识符)和句点(例如
.
)以及索引运算符(例如[<index>]
)连接而成:第一个字段名称不需要指定前导句点。
索引运算符中的索引值可以是非负十进制数(用于数组),也可以是加单引号或双引号的字符串字面量(用于对象字段)。
有关更多详细信息,请参阅 查询半结构化数据。
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" |
+----+---------------------------+