- 类别:
半结构化和结构化数据函数 (数组/对象)
OBJECT_CONSTRUCT¶
返回由实参构造的 OBJECT。
语法¶
OBJECT_CONSTRUCT( [<key1>, <value1> [, <keyN>, <valueN> ...]] )
OBJECT_CONSTRUCT( * )
返回¶
返回值的数据类型是 OBJECT。
使用说明¶
该函数接受以下任一内容:
由零个或多个键值对组成的序列(其中键是字符串,值为任意类型)。
星号。与星号一同调用时,使用属性名称作为键,使用关联的元组值作为值来构造对象。请参阅以下示例。
如果键或值为 NULL(即 SQL NULL),则结果对象中将省略键值对。不省略由非空字符串作为键和 JSON NULL 作为值组成的键值对(即 PARSE_JSON(NULL))。
构造的对象不一定保留键值对的原始顺序。
在许多情况下,可以使用 OBJECT 常量 (也称为 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 TABLE demo_table_1 (province VARCHAR, created_date DATE); INSERT INTO demo_table_1 (province, created_date) VALUES ('Manitoba', '2020-01-18'::DATE), ('Alberta', '2020-01-19'::DATE);SELECT province, created_date FROM demo_table_1 ORDER BY province; +----------+--------------+ | PROVINCE | CREATED_DATE | |----------+--------------| | Alberta | 2020-01-19 | | Manitoba | 2020-01-18 | +----------+--------------+SELECT OBJECT_CONSTRUCT(*) AS oc FROM demo_table_1 ORDER BY oc['PROVINCE']; +---------------------------------+ | OC | |---------------------------------| | { | | "CREATED_DATE": "2020-01-19", | | "PROVINCE": "Alberta" | | } | | { | | "CREATED_DATE": "2020-01-18", | | "PROVINCE": "Manitoba" | | } | +---------------------------------+
这是另一个使用 *
的示例。在这种情况下,没有指定属性名,因此 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) ) FROM demo_table_1; +-------------------------------------------------------------------------------+ | 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) | | ) | |-------------------------------------------------------------------------------| | { | | "created_date_seconds": 1579305600, | | "dataset_size": 2, | | "distinct_province": 2, | | "foo": 1234567 | | } | | { | | "created_date_seconds": 1579392000, | | "dataset_size": 2, | | "distinct_province": 2, | | "foo": 1234567 | | } | +-------------------------------------------------------------------------------+