【问题标题】:Extract specific Columns from PostgreSQL table and Do an update on its values从 PostgreSQL 表中提取特定列并更新其值
【发布时间】:2015-10-27 21:42:58
【问题描述】:

我有一个 PostgreSQL 数据库,我需要更新特定列的值。列数这么多,我需要对不同的表做同样的操作所以最好动态提取它们。

更具体地说,我想从表中提取名称以“_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 "$1"
LINE 1: update myInitialTable set  $1  = case when  $2  = '' then NULL when  ...

任何帮助表示赞赏:)

【问题讨论】:

  • 您是否要将所有列设置为相同的值?
  • 不会根据内容使用不同的值(正好 2 个值)
  • 解释(在问题中)如何区分这两种列。
  • like '%_suffix%' 实际上意味着包含 '{any character}suffix' (不是 '_suffix' - 下划线是任何字符)。您可能想要like '%\_suffix',这意味着“以”_suffix 结尾。除此之外,我仍然不明白你想用什么值来更新这些列。
  • 我想将表缩减为仅包含以“_suffix”结尾的列并忽略所有其他列的表。

标签: sql database postgresql plpgsql dynamic-sql


【解决方案1】:

在您的函数中,您需要使用dynamic commandsformat() 函数通常很有帮助。

示例数据:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2019-10-20
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多