[英]Snowflake (stored procedure): flatten json object in table into several columns
我有一張雪花表,其中有一列包含 json blob。 我想用存儲過程展平該列。 問題是我想對具有不同 json 模式的不同表使用相同的存儲過程。 在下面的示例中,json 由兩個鍵/值對組成。 對於另一個表,可能有 5 個鍵/值對需要展平。
是否可以使用一個存儲過程來做到這一點? 如果是,我該怎么做?
原表
動物 | 姓名 | 詳細信息(json blob) |
---|---|---|
獅子 | 喬治 | 獅子鍵1:值1,獅子鍵2:值2 |
獅子 | 帕特里克 | 獅子鍵1:值1,獅子鍵2:值2 |
新桌:獅子桌
姓名 | 獅子鑰匙1 | 獅子鑰匙2 |
---|---|---|
喬治 | 價值1 | 價值2 |
帕特里克 | 價值1 | 價值2 |
保羅 | 價值1 | 價值2 |
我認為這不可行,但這是一個示例程序:
CREATE OR REPLACE PROCEDURE generate_dynamic_table()
RETURNS VARCHAR
LANGUAGE SQL
AS
DECLARE
c1 CURSOR FOR select DISTINCT KEY from mytable, lateral flatten( details );
SQLstatement VARCHAR := 'CREATE TABLE targettable ( Name, ';
SELstmt VARCHAR := 'AS SELECT Name, ';
BEGIN
FOR c IN c1 DO
SQLstatement := SQLstatement || '"' || c.KEY || '", ';
SELstmt := SELstmt || 'details:"' || c.KEY || '", ';
END FOR;
SQLstatement := LEFT( SQLstatement, LEN(SQLstatement) - 2 ) || ') ';
SELstmt := LEFT( SELstmt, LEN(SELstmt) - 2 ) || '';
SQLstatement := SQLstatement || SELstmt || ' FROM mytable';
EXECUTE IMMEDIATE SQLstatement;
RETURN 'OK';
END;
call generate_dynamic_table();
運行程序后:
select * from targettable;
+---------+-----------+-----------+
| NAME | lion key1 | lion key2 |
+---------+-----------+-----------+
| Georg | "value1" | "value2" |
| Patrick | "value1" | "value2" |
+---------+-----------+-----------+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.