繁体   English   中英

使用 Sql 在雪花上创建 Json object 的问题

[英]Issues creating Json object on snowflake using Sql

我是 Snowflake 的新手,我正在尝试从现有表创建一个新表并将一些行转换为 json 格式。

我在雪花上有什么(表名: lex)

区域 资源 类型 日期
莫达克 好的 2021

我想在雪花上实现什么

区域 来源
[{"source": "modak","period": {"type": "good","date": "2021"} }]

任何关于如何使用 SQl 的 go 的指导将不胜感激。

您可以使用 object_construct 来生成 JSON 对象:

select
area, array_construct( object_construct( 'source', source, 'period', object_construct( 'type',type, 'date',date )) ) sources
from
values ('One','modak','good','2021') tmp (area, source,type,date);

+------+-------------------------------------------------------------------------+
| AREA |                                 SOURCES                                 |
+------+-------------------------------------------------------------------------+
| One  | [ { "period": { "date": "2021", "type": "good" }, "source": "modak" } ] |
+------+-------------------------------------------------------------------------+

我还使用 array_construct 添加括号([])

对象构造:

https://docs.snowflake.com/en/sql-reference/functions/object_construct.html

ARRAY_CONSTRUCT:

https://docs.snowflake.com/en/sql-reference/functions/array_construct.html

PS:JSON 元素的顺序在访问它们时并不重要:

select parse_json(j):source, parse_json(j):period.type 
from
values 
('{ "period": { "date": "2021", "type": "good" }, "source": "modak" }'),
('{"source": "modak","period": {"type": "good","date": "2021"} }') tmp(j);

+----------------------+---------------------------+
| PARSE_JSON(J):SOURCE | PARSE_JSON(J):PERIOD.TYPE |
+----------------------+---------------------------+
| "modak"              | "good"                    |
| "modak"              | "good"                    |
+----------------------+---------------------------+

所以完整的答案是:

WITH lex AS (
    SELECT * FROM VALUES
    ('One', 'modak', 'good', 2021)
    v(area, source, type, date)
)
SELECT l.area,
    ARRAY_AGG(OBJECT_CONSTRUCT('source', l.source, 'period', OBJECT_CONSTRUCT('type', l.type, 'date', l.date))) as sources
FROM lex AS l
GROUP BY 1
ORDER BY 1;

这使:

区域 来源
[ {“期间”:{“日期”:2021,“类型”:“好”},“来源”:“modak”}]

Gokhan 的回答显示了如何使用ARRAY_CONSTRUCT构建 static 数组,但如果您有如下动态输入:

WITH lex AS (
    SELECT * FROM VALUES
    ('One', 'modak', 'good', 2021),
    ('One', 'modak', 'bad', 2022),
    ('Two', 'modak', 'good', 2021)
    v(area, source, type, date)
)

你想要,下面,你需要使用ARRAY_AGG

区域 来源
[ {“时期”:{“日期”:2021,“类型”:“好”},“来源”:“modak”},{“时期”:{“日期”:2022,“类型”:“坏” }, "来源": "modak" } ]
[ {“期间”:{“日期”:2021,“类型”:“好”},“来源”:“modak”}]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM