寻找 PL/PGSQL 函数返回 N 列

问题描述 投票:0回答:0

在 PL/pgSQL 中运行一个函数以返回 N 列并放入一个视图或允许在没有人工干预的情况下更新 N 列的表的东西。

使用下面的代码。
来自https://stackoverflow.com/questions/75594224/

---sample data 
DROP TABLE IF EXISTS  split_clm;
CREATE TEMP TABLE  split_clm(
  id integer PRIMARY KEY,
  name text,
  hobby text, 
  value int
);
INSERT INTO  split_clm (id, name, hobby,value) VALUES
(1, 'Rene', 'Python, Monkey_Bars','5'),
(2, 'CJ', 'Trading, Python','25'),
(3, 'Herlinda', 'Fashion','15'),
(4, 'DJ', 'Consutling, Sales','35'),
(5, 'Martha', 'Social_Media, Teaching','45'),
(6, 'Doug', 'Leadership, Management','55'),
(7, 'Mathew', 'Finance, Emp_Engagement','65'),
(8, 'Mayers', 'Sleeping, Coding, Crossfit','75'),
(9, 'Mike', 'YouTube, Athletics','85'),
(10, 'Peter', 'Eat, Sleep, Python','95'),
(11, 'Thomas', 'Read, Trading, Sales','105');
/****query****/
--1NF <done>
DROP TABLE IF EXISTS  split_clm_Nor;
CREATE TEMP TABLE     split_clm_Nor  AS 
  SELECT id, name, unnest(string_to_array(hobby, ', ')) AS Ivalues , value
  FROM  split_clm
  ORDER BY id;
-- 
 --Select * from    split_clm_Nor limit 6; ---
 ---ver 2.0
DROP TABLE IF EXISTS  split_clm_Nor2;
  CREATE TEMP TABLE      split_clm_Nor2  AS
  SELECT id, name, lower(unnest(string_to_array(hobby, ', '))) AS Ivalues , value,count(1)  as "Case_Volume"
  FROM  split_clm
  GROUP BY 1,2,3,4
  ORDER BY id
;
Select * from    split_clm_Nor2  ; 
 ---------------------------
 DROP TABLE IF EXISTS   tmpTblTyp2 CASCADE ; 
DO LANGUAGE plpgsql $$ 
DECLARE v_sqlstring VARCHAR  = ''; 
BEGIN 
v_sqlstring := CONCAT( 'CREATE  TABLE  tmpTblTyp2 AS SELECT '   
                      ,(SELECT  STRING_AGG( CONCAT('NULL::int AS ' , ivalues )::TEXT , ' ,' ORDER BY ivalues )::TEXT
                        FROM (SELECT DISTINCT ivalues  FROM  split_clm_Nor2) a
                        )
                      ,' LIMIT 0 '    
                       ) ; -- RAISE NOTICE '%', v_sqlstring ;  
EXECUTE( v_sqlstring ) ; END $$; 
 --------------------------------------------
DROP TABLE IF EXISTS  tmpMoJson ;
CREATE TEMP TABLE     tmpMoJson  AS
--CREATE TEMP TABLE tmpMoJson AS
      SELECT 
         name AS name
         ,(json_build_array( mivalues )) AS js_mivalues_arr
         ,json_populate_recordset ( NULL::tmpTblTyp2 /** use temp table as a record type!!*/
                                   , json_build_array( mivalues )  /** builds row-type column that can be expanded with (jprs).* */
                                  ) jprs  
      FROM ( SELECT name
                   ,json_object_agg(ivalues,value) AS mivalues 
             FROM split_clm_Nor2
             GROUP BY 1
             ORDER BY 1
            ) a
;
Select * from    tmpMoJson  ; 
 SELECT  
  name
,(ROW((jprs).*):: tmpTblTyp2).* -- explode the composite type row
--, js_mivalues_arr /** optional **/
FROM  tmpMoJson ;

期待得到那个表继续更新

756d
姓名 田径 编码 咨询 运动量来找到 emp_engagement 时尚 金融 领导力 管理 猴子酒吧 蟒蛇 阅读 销售 睡觉 睡觉 社交媒体 教学 交易 youtube
CJ 25 25
DJ 35 35
道格 55 55
赫琳达 15
玛莎 45 45
马修 65 65
迈尔斯 75 75 75
迈克 85 85
彼得 95 95 95
雷内 5 5
托马斯 105 105 105
postgresql plpgsql postgresql-9.3 postgresql-9.4
© www.soinside.com 2019 - 2024. All rights reserved.