簡體   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