[英]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.