繁体   English   中英

雪花(存储过程):将表中的 json object 展平成几列

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM