在 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 ;
期待得到那个表继续更新
姓名 | 田径 | 编码 | 咨询 | 运动量来找到 | 吃 | 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 | 空 |