- 类别:
半结构化和结构化数据函数 (数组/对象)
OBJECT_CONSTRUCT¶
返回由实参构造的 OBJECT。
语法¶
OBJECT_CONSTRUCT( [<key>, <value> [, <key>, <value> , ...]] )
OBJECT_CONSTRUCT(*)
实参¶
key
键值对中的键。每个键都是一个 VARCHAR 值。
value
与键关联的值。该值可以是任何数据类型。
*
当使用星号(通配符)调用时,OBJECT 值使用属性名称作为键,使用关联的值作为值,从指定的数据构造。请参阅以下示例。
当您将通配符传递给函数时,您可以使用表的名称或别名来限定通配符。例如,要传入名为
mytable
的表中的所有列,请指定以下内容:(mytable.*)
您还可以使用 ILIKE 和 EXCLUDE 关键字进行筛选:
ILIKE 筛选条件,用于查找与指定模式匹配的列名。只允许使用一种模式。例如:
(* ILIKE 'col1%')
EXCLUDE 筛选出与指定列或列不匹配的列名。例如:
(* EXCLUDE col1) (* EXCLUDE (col1, col2))
使用这些关键字时,限定符有效。以下示例使用 ILIKE 关键字筛选出与表
mytable
中的模式col1%
相匹配的所有列:(mytable.* ILIKE 'col1%')
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);
+--------------------------------------------------+
| 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);
SELECT province, created_date
FROM demo_table_1
ORDER BY province;
+----------+--------------+
| PROVINCE | CREATED_DATE |
|----------+--------------|
| Alberta | 2024-01-19 |
| Manitoba | 2024-01-18 |
+----------+--------------+
SELECT OBJECT_CONSTRUCT(*) AS oc
FROM demo_table_1
ORDER BY oc['PROVINCE'];
+---------------------------------+
| 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'];
+--------------------------+
| OC |
|--------------------------|
| { |
| "PROVINCE": "Alberta" |
| } |
| { |
| "PROVINCE": "Manitoba" |
| } |
+--------------------------+
此示例使用 *
并包括 EXCLUDE 关键字来筛选输出:
SELECT OBJECT_CONSTRUCT(* EXCLUDE province) AS oc
FROM demo_table_1
ORDER BY oc['PROVINCE'];
+--------------------------------+
| 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'];
+--------------------------------+
| OC |
|--------------------------------|
| { |
| "CREATED_DATE": "2024-01-18" |
| } |
| { |
| "CREATED_DATE": "2024-01-19" |
| } |
+--------------------------------+
这是另一个使用 *
的示例。在这种情况下,没有指定属性名,因此 Snowflake 使用 COLUMN1
、COLUMN2
等:
SELECT OBJECT_CONSTRUCT(*) FROM VALUES(1,'x'), (2,'y');
+---------------------+
| 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;
+-----------------------+
| 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;
+---------------------------------------+
| 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 |
| } |
+---------------------------------------+