![](/img/trans.png)
[英]issues converting output from a view to json and array in snowflake using SQL
[英]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.