类别:

:doc:`/sql-reference/functions-semistructured`(提取)

GET

ARRAYlabel-data_type_object`(或者包含 ARRAY 或 OBJECT 的 :ref:`label-data_type_variant)中提取一个值。

如果任一实参为 NULL,则函数返回 NULL。

请注意,此函数不应与 GET DML 命令混淆。

另请参阅:

GET_IGNORE_CASEGET_PATH、:

语法

ARRAY(或包含 ARRAY 的 VARIANT)

GET( <array> , <index> )

GET( <variant> , <index> )
Copy

OBJECT(或包含 OBJECT 的 VARIANT)

GET( <object> , <field_name> )

GET( <variant> , <field_name> )
Copy

MAP

GET( <map> , <key> )
Copy

实参

array

计算结果为 ARRAY 的表达式。

index

计算结果为 INTEGER 的表达式。这指定要从 ARRAY 中检索的元素的位置。该位置是基于 0 的,而不是基于 1 的。

如果索引指向数组边界之外,或者索引元素不存在(在稀疏数组中):

  • 如果 array 为半结构化 ARRAY,则该函数返回 NULL。

  • 如果 array 是结构化 ARRAY,则会发生错误。

variant

计算结果为包含 ARRAY 或 OBJECT 的 VARIANT 的表达式。

object

计算结果为包含键值对的 OBJECT 的表达式。

field_name

计算结果为 VARCHAR 的表达式。这指定了您想要检索值的键值对中的键。

field_name 不能是空字符串。

如果 object结构化 OBJECT,则必须为 field_name 指定一个常数。

如果 object 不包含指定键:

  • 如果 object 为半结构化 OBJECT,则该函数返回 NULL。

  • 如果 object 是结构化 OBJECT,则会发生错误。

map

计算结果为 MAP 的表达式。

key

您要检索其值的键值对中的键。

如果 map 不包含指定的键,则该函数返回 NULL。

返回

  • 返回值是 ARRAY 的指定元素,或者是对应于 OBJECT 中键值对的指定键的值。

  • 如果输入对象是半结构化 OBJECT、ARRAY 或 VARIANT,则该函数返回 VARIANT。数据类型为 VARIANT,因为:

    • 在 ARRAY 中,每个元素都属于 VARIANT 类型。

    • 在 OBJECT 中,每个键值对中的值都是 VARIANT 类型。

  • 如果输入对象是 结构化 OBJECT、结构化 ARRAY 或 MAP,该函数返回为该对象指定的类型的值。

    例如,如果输入对象的类型是 ARRAY(NUMBER),则该函数返回 NUMBER。

使用说明

  • GET 对 field_name 应用区分大小写的匹配。对于不区分大小写的匹配,请使用 GET_IGNORE_CASE

  • 如果第一个参数是 VARIANT 类型:

    • 如果第二个参数是 VARCHAR 类型(例如 field_name),则该函数在 variant 不包含 OBJECT 的情况下返回 NULL。

    • 如果第二个参数是 INTEGER 类型(例如 index),则该函数在 variant 不包含 ARRAY 的情况下返回 NULL。

示例

创建一个包含示例数据的表:

CREATE TABLE vartab (a ARRAY, o OBJECT, v VARIANT);
INSERT INTO vartab (a, o, v) 
  SELECT
    ARRAY_CONSTRUCT(2.71, 3.14),
    OBJECT_CONSTRUCT('Ukraine', 'Kyiv'::VARIANT, 
                     'France',  'Paris'::VARIANT),
    TO_VARIANT(OBJECT_CONSTRUCT('weatherStationID', 42::VARIANT,
                     'timestamp', '2022-03-07 14:00'::TIMESTAMP_LTZ::VARIANT,
                     'temperature', 31.5::VARIANT,
                     'sensorType', 'indoor'::VARIANT))
    ;
Copy
SELECT a, o, v FROM vartab;
+---------+----------------------+-------------------------------------------------+
| A       | O                    | V                                               |
|---------+----------------------+-------------------------------------------------|
| [       | {                    | {                                               |
|   2.71, |   "France": "Paris", |   "sensorType": "indoor",                       |
|   3.14  |   "Ukraine": "Kyiv"  |   "temperature": 31.5,                          |
| ]       | }                    |   "timestamp": "2022-03-07 14:00:00.000 -0800", |
|         |                      |   "weatherStationID": 42                        |
|         |                      | }                                               |
+---------+----------------------+-------------------------------------------------+
Copy

提取 ARRAY 的第一个元素:

SELECT GET(a, 0) FROM vartab;
+-----------+
| GET(A, 0) |
|-----------|
| 2.71      |
+-----------+
Copy

给定一个国家的名称,从包含国家名称和首都城市的 OBJECT 中提取该国首都城市的名称:

SELECT GET(o, 'Ukraine') FROM vartab;
+-------------------+
| GET(O, 'UKRAINE') |
|-------------------|
| "Kyiv"            |
+-------------------+
Copy

从包含 OBJECT 的 VARIANT 中提取温度:

SELECT GET(v, 'temperature') FROM vartab;
+-----------------------+
| GET(V, 'TEMPERATURE') |
|-----------------------|
| 31.5                  |
+-----------------------+
Copy

有关更详细的示例,请参阅 查询半结构化数据

有关将 GET 与 XMLGET 结合使用的示例,请参阅 XMLGET 中的示例和用法说明部分。

语言: 中文