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