Postgresql 如何在函数的UPDATE语句中使用动态列名?

Postgresql 如何在函数的UPDATE语句中使用动态列名?,postgresql,plpgsql,dynamic-sql,Postgresql,Plpgsql,Dynamic Sql,我想通过在循环中的运行时获取列名来更新所有文本列 drop function if exists aa.clean_data(); create or replace function aa.clean_data() returns void language plpgsql as $$ declare col_name varchar(50); begin for col_name in select column_name from information_schema.co

我想通过在循环中的运行时获取列名来更新所有文本列

drop function if exists aa.clean_data();
create or replace function aa.clean_data()
returns void
language plpgsql
as
$$
declare
    col_name varchar(50);
begin
    for col_name in select column_name from information_schema.columns where table_schema = 'aa' and table_name = 'test' and data_type in ('character varying', 'character','text', '"char"', 'name') loop
        
        update autopipe.test set col_name = initcap(col_name); -- case correction
        
        update autopipe.test set col_name = REGEXP_REPLACE(col_name, '[^a-zA-Z\d\s:/\//]', '', 'g'); -- non alpha-numeric characters
            
        update autopipe.test set col_name = REGEXP_REPLACE(col_name, '\s+$', '', 'g'); -- Trim padding
        
    end loop;

end;

$$;
上面的所有update语句都在下面给出了错误,因为它正在运行时工作,无法计算“col_name”中的值

下面的问题似乎接近我的问题是什么,但我不知道如何在我的情况下使用它


一些动态SQL将有所帮助。
选择
更新
查询取自问题,没有变化

drop函数如果存在aa.clean_data();
创建或替换函数aa.clean_data()返回无效语言plpgsql作为
$$
声明
UPDATE_A常量文本:=$dynsql$UPDATE autopipe.test SET%I=initcap(%I)$dynsql$;
更新B常量文本:=$dynsql$UPDATE autopipe.test集%I=REGEXP\u REPLACE(%I),[^a-zA-Z\d\s:/\/]','''g')$dynsql$;
UPDATE_C常量文本:=$dynsql$UPDATE autopipe.test SET%I=REGEXP_REPLACE(%I,'\s+$,''g')$dynsql$;
颜色名称文本;
开始
对于信息_schema.columns中的col_name,请选择column_name from information_schema.columns,其中table_schema='aa'和table_name='test',数据_键入('character variabling','character','text','char','name')循环
执行格式(更新列A、列名称、列名称);
执行格式(更新列B、列名称、列名称);
执行格式(更新C、列名称、列名称);
端环;
结束;
$$;

在进行了如此大规模的
更新之后,在目标表上运行
VACCUM

@wildplasser可能是值得的。我不想重命名列,只需要更新每个列中的行,这些行是文本数据类型。您链接到的问题将引导您走向正确的方向。对于动态SQL,您需要执行xyz语句,其中xyz是您构造的查询。
SQL Error [42703]: ERROR: column "col_name" of relation "test" does not exist
  Where: PL/pgSQL function autopipe.clean_data() line 7 at SQL statement