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