类别:

半结构化和结构化数据函数 (提取)

GET_PATH、:

使用路径名从半结构化数据中提取值。

GET_PATH 是 GET 的变体;它将 VARIANTOBJECTARRAY 列名用作第一个实参,并根据作为第二个实参提供的路径名提取字段或元素的值。

语法

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 表示法;它由字段名称(标识符)和句点(例如 .)以及索引运算符(例如 [<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;
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"               |
+----+---------------------------+
语言: 中文