从 PostgreSQL table 中提取特定列并对其值进行更新
Extract specific Columns from PostgreSQL table and Do an update on its values
我有一个 PostgreSQL 数据库,我需要对特定列的值进行更新。列数太大,我需要对不同的table进行相同的操作,所以最好动态提取它们。
更具体地说,我想从 table 中提取名称以“_suffix”结尾的所有列,并对它们的值进行更新。
我开始尝试做剧本,但不知道这条路对不对!
SELECT columns.column_name
FROM information_schema.columns
WHERE columns.table_name = 'myInitialTable' AND columns.column_name like '%\_suffix%' AND columns.table_schema = 'public';
我创建了这个查询的视图,并在以下函数中使用了它:
CREATE OR REPLACE FUNCTION updatetable() RETURNS int4 AS
$BODY$
DECLARE r RECORD;
BEGIN
FOR r IN SELECT * from v_reduced_table LOOP
update myInitialTable
set r.column_name = case
when r.column_name = '' then NULL
when r.column_name = 'value1' or r.column_name = 'value2' then 'xxxxx'
else r.column_name end;
END LOOP;
return 1;
END;
$BODY$
LANGUAGE plpgsql;
SELECT updatetable() as output;
此查询对每个以后缀结尾的列执行循环并更新其值。但是当我 运行 我得到
ERROR: syntax error at or near ""
LINE 1: update myInitialTable set = case when = '' then NULL when ...
感谢任何帮助:)
在您的函数中您需要使用 dynamic commands。
函数 format()
通常很有帮助。
示例数据:
create table my_table(col1_suffix text, col2_suffix text, col3_suffix text);
insert into my_table values ('a', 'b', 'c');
示例函数:
CREATE OR REPLACE FUNCTION update_my_table() RETURNS void AS
$BODY$
DECLARE r RECORD;
BEGIN
FOR r IN
SELECT columns.column_name
FROM information_schema.columns
WHERE columns.table_name = 'my_table'
AND columns.column_name like '%\_suffix%'
AND columns.table_schema = 'public'
LOOP
EXECUTE(FORMAT($f$
UPDATE my_table
SET %s = CASE
WHEN '%s' = 'col1_suffix' THEN 'col1'
WHEN '%s' = 'col2_suffix' OR '%s' = 'col3_suffix' THEN 'xxxxx'
END;$f$, r.column_name, r.column_name, r.column_name, r.column_name));
END LOOP;
END;
$BODY$
LANGUAGE plpgsql;
用法:
select update_my_table();
select * from my_table;
col1_suffix | col2_suffix | col3_suffix
-------------+-------------+-------------
col1 | xxxxx | xxxxx
(1 row)
我有一个 PostgreSQL 数据库,我需要对特定列的值进行更新。列数太大,我需要对不同的table进行相同的操作,所以最好动态提取它们。
更具体地说,我想从 table 中提取名称以“_suffix”结尾的所有列,并对它们的值进行更新。 我开始尝试做剧本,但不知道这条路对不对!
SELECT columns.column_name
FROM information_schema.columns
WHERE columns.table_name = 'myInitialTable' AND columns.column_name like '%\_suffix%' AND columns.table_schema = 'public';
我创建了这个查询的视图,并在以下函数中使用了它:
CREATE OR REPLACE FUNCTION updatetable() RETURNS int4 AS
$BODY$
DECLARE r RECORD;
BEGIN
FOR r IN SELECT * from v_reduced_table LOOP
update myInitialTable
set r.column_name = case
when r.column_name = '' then NULL
when r.column_name = 'value1' or r.column_name = 'value2' then 'xxxxx'
else r.column_name end;
END LOOP;
return 1;
END;
$BODY$
LANGUAGE plpgsql;
SELECT updatetable() as output;
此查询对每个以后缀结尾的列执行循环并更新其值。但是当我 运行 我得到
ERROR: syntax error at or near ""
LINE 1: update myInitialTable set = case when = '' then NULL when ...
感谢任何帮助:)
在您的函数中您需要使用 dynamic commands。
函数 format()
通常很有帮助。
示例数据:
create table my_table(col1_suffix text, col2_suffix text, col3_suffix text);
insert into my_table values ('a', 'b', 'c');
示例函数:
CREATE OR REPLACE FUNCTION update_my_table() RETURNS void AS
$BODY$
DECLARE r RECORD;
BEGIN
FOR r IN
SELECT columns.column_name
FROM information_schema.columns
WHERE columns.table_name = 'my_table'
AND columns.column_name like '%\_suffix%'
AND columns.table_schema = 'public'
LOOP
EXECUTE(FORMAT($f$
UPDATE my_table
SET %s = CASE
WHEN '%s' = 'col1_suffix' THEN 'col1'
WHEN '%s' = 'col2_suffix' OR '%s' = 'col3_suffix' THEN 'xxxxx'
END;$f$, r.column_name, r.column_name, r.column_name, r.column_name));
END LOOP;
END;
$BODY$
LANGUAGE plpgsql;
用法:
select update_my_table();
select * from my_table;
col1_suffix | col2_suffix | col3_suffix
-------------+-------------+-------------
col1 | xxxxx | xxxxx
(1 row)