类别:

半结构化和结构化数据函数 (数组/对象)

OBJECT_CONSTRUCT

返回由实参构造的 OBJECT

另请参阅:

OBJECT_CONSTRUCT_KEEP_NULL

语法

OBJECT_CONSTRUCT( [<key>, <value> [, <key>, <value> , ...]] )

OBJECT_CONSTRUCT(*)
Copy

实参

key

键值对中的键。每个键都是一个 VARCHAR 值。

value

与键关联的值。该值可以是任何数据类型。

*

当使用星号(通配符)调用时,OBJECT 值使用属性名称作为键,使用关联的值作为值,从指定的数据构造。请参阅以下示例。

当您将通配符传递给函数时,您可以使用表的名称或别名来限定通配符。例如,要传入名为 mytable 的表中的所有列,请指定以下内容:

(mytable.*)
Copy

您还可以使用 ILIKE 和 EXCLUDE 关键字进行筛选:

  • ILIKE 筛选条件,用于查找与指定模式匹配的列名。只允许使用一种模式。例如:

    (* ILIKE 'col1%')
    
    Copy
  • EXCLUDE 筛选出与指定列或列不匹配的列名。例如:

    (* EXCLUDE col1)
    
    (* EXCLUDE (col1, col2))
    
    Copy

使用这些关键字时,限定符有效。以下示例使用 ILIKE 关键字筛选出与表 mytable 中的模式 col1% 相匹配的所有列:

(mytable.* ILIKE 'col1%')
Copy

ILIKE 和 EXCLUDE 关键字不能组合在单个函数调用中。

您还可以在 对象常量 中指定通配符。

对于此函数,ILIKE 和 EXCLUDE 关键字仅在 SELECT 列表或 GROUP BY 子句中有效。

关于 ILIKE 和 EXCLUDE 关键字的更多信息,请参阅 SELECT 中的“参数”部分。

返回

返回 OBJECT 类型的值。

使用说明

  • 如果键或值为 NULL(即 SQL NULL),则结果对象中将省略键值对。一个键值对,由不是 NULL 的字符串作为键,将 JSON null 作为值(即 PARSE_JSON('NULL'))未省略。有关更多信息,请参阅 VARIANT null

  • 构造的对象不一定保留键值对的原始顺序。

  • 在许多情况下,可以使用 :ref:`OBJECT 常量 <label-object_constant>`(也称为 OBJECT 字面量)来代替 OBJECT_CONSTRUCT 函数。

示例

此示例说明如何构造简单对象:

SELECT OBJECT_CONSTRUCT('a', 1, 'b', 'BBBB', 'c', NULL);
Copy
+--------------------------------------------------+
| OBJECT_CONSTRUCT('A', 1, 'B', 'BBBB', 'C', NULL) |
|--------------------------------------------------|
| {                                                |
|   "a": 1,                                        |
|   "b": "BBBB"                                    |
| }                                                |
+--------------------------------------------------+

此示例使用 * 从 FROM 子句获取属性名和值:

CREATE OR REPLACE TABLE demo_table_1 (province VARCHAR, created_date DATE);
INSERT INTO demo_table_1 (province, created_date) VALUES
  ('Manitoba', '2024-01-18'::DATE),
  ('Alberta', '2024-01-19'::DATE);
Copy
SELECT province, created_date
  FROM demo_table_1
  ORDER BY province;
Copy
+----------+--------------+
| PROVINCE | CREATED_DATE |
|----------+--------------|
| Alberta  | 2024-01-19   |
| Manitoba | 2024-01-18   |
+----------+--------------+
SELECT OBJECT_CONSTRUCT(*) AS oc
  FROM demo_table_1
  ORDER BY oc['PROVINCE'];
Copy
+---------------------------------+
| OC                              |
|---------------------------------|
| {                               |
|   "CREATED_DATE": "2024-01-19", |
|   "PROVINCE": "Alberta"         |
| }                               |
| {                               |
|   "CREATED_DATE": "2024-01-18", |
|   "PROVINCE": "Manitoba"        |
| }                               |
+---------------------------------+

此示例使用 * 并包括 ILIKE 关键字来筛选输出:

SELECT OBJECT_CONSTRUCT(* ILIKE 'prov%') AS oc
  FROM demo_table_1
  ORDER BY oc['PROVINCE'];
Copy
+--------------------------+
| OC                       |
|--------------------------|
| {                        |
|   "PROVINCE": "Alberta"  |
| }                        |
| {                        |
|   "PROVINCE": "Manitoba" |
| }                        |
+--------------------------+

此示例使用 * 并包括 EXCLUDE 关键字来筛选输出:

SELECT OBJECT_CONSTRUCT(* EXCLUDE province) AS oc
  FROM demo_table_1
  ORDER BY oc['PROVINCE'];
Copy
+--------------------------------+
| OC                             |
|--------------------------------|
| {                              |
|   "CREATED_DATE": "2024-01-18" |
| }                              |
| {                              |
|   "CREATED_DATE": "2024-01-19" |
| }                              |
+--------------------------------+

此示例等同于前面的示例,但它使用对象常量而不是 OBJECT_CONSTRUCT 函数:

SELECT {* EXCLUDE province} AS oc
  FROM demo_table_1
  ORDER BY oc['PROVINCE'];
Copy
+--------------------------------+
| OC                             |
|--------------------------------|
| {                              |
|   "CREATED_DATE": "2024-01-18" |
| }                              |
| {                              |
|   "CREATED_DATE": "2024-01-19" |
| }                              |
+--------------------------------+

这是另一个使用 * 的示例。在这种情况下,没有指定属性名,因此 Snowflake 使用 COLUMN1COLUMN2 等:

SELECT OBJECT_CONSTRUCT(*) FROM VALUES(1,'x'), (2,'y');
Copy
+---------------------+
| OBJECT_CONSTRUCT(*) |
|---------------------|
| {                   |
|   "COLUMN1": 1,     |
|   "COLUMN2": "x"    |
| }                   |
| {                   |
|   "COLUMN1": 2,     |
|   "COLUMN2": "y"    |
| }                   |
+---------------------+

此示例使用 SQL NULL 和字符串 'null'

SELECT OBJECT_CONSTRUCT(
  'Key_One', PARSE_JSON('NULL'), 
  'Key_Two', NULL, 
  'Key_Three', 'null') AS obj;
Copy
+-----------------------+
| OBJ                   |
|-----------------------|
| {                     |
|   "Key_One": null,    |
|   "Key_Three": "null" |
| }                     |
+-----------------------+

OBJECT_CONSTRUCT 支持表达式和查询来添加、修改或省略 JSON 对象中的值。

SELECT OBJECT_CONSTRUCT(
    'foo', 1234567,
    'dataset_size', (SELECT COUNT(*) FROM demo_table_1),
    'distinct_province', (SELECT COUNT(DISTINCT province) FROM demo_table_1),
    'created_date_seconds', extract(epoch_seconds, created_date)
  )  AS json_object
  FROM demo_table_1;
Copy
+---------------------------------------+
| JSON_OBJECT                           |
|---------------------------------------|
| {                                     |
|   "created_date_seconds": 1705536000, |
|   "dataset_size": 2,                  |
|   "distinct_province": 2,             |
|   "foo": 1234567                      |
| }                                     |
| {                                     |
|   "created_date_seconds": 1705622400, |
|   "dataset_size": 2,                  |
|   "distinct_province": 2,             |
|   "foo": 1234567                      |
| }                                     |
+---------------------------------------+
语言: 中文