如何在函数的 UPDATE 语句中使用动态列名?
How to use dynamic column names in an UPDATE statement in a function?
我想通过在循环中获取运行时的列名称来更新所有文本列。
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;
$$;
上面的所有更新语句都在下面给出错误,因为它正在运行时工作并且无法计算出“col_name”中的值
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
下面的问题似乎和我的问题很接近,但我不知道如何在我的案例中使用它
一些动态 SQL 会有所帮助。 select
和 update
查询取自问题 w/o change.
drop function if exists aa.clean_data();
create or replace function aa.clean_data() returns void language plpgsql as
$$
declare
UPDATE_A constant text := $dynsql$ UPDATE autopipe.test SET %I = initcap(%I) $dynsql$;
UPDATE_B constant text := $dynsql$ UPDATE autopipe.test SET %I = REGEXP_REPLACE(%I, '[^a-zA-Z\d\s:/\//]', '', 'g') $dynsql$;
UPDATE_C constant text := $dynsql$ UPDATE autopipe.test SET %I = REGEXP_REPLACE(%I, '\s+$', '', 'g') $dynsql$;
col_name text;
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
execute format(UPDATE_A, col_name, col_name);
execute format(UPDATE_B, col_name, col_name);
execute format(UPDATE_C, col_name, col_name);
end loop;
end;
$$;
在如此巨大的 UPDATE
.
之后,在目标 table 上可能值得 运行 VACCUM
我想通过在循环中获取运行时的列名称来更新所有文本列。
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;
$$;
上面的所有更新语句都在下面给出错误,因为它正在运行时工作并且无法计算出“col_name”中的值
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
下面的问题似乎和我的问题很接近,但我不知道如何在我的案例中使用它
一些动态 SQL 会有所帮助。 select
和 update
查询取自问题 w/o change.
drop function if exists aa.clean_data();
create or replace function aa.clean_data() returns void language plpgsql as
$$
declare
UPDATE_A constant text := $dynsql$ UPDATE autopipe.test SET %I = initcap(%I) $dynsql$;
UPDATE_B constant text := $dynsql$ UPDATE autopipe.test SET %I = REGEXP_REPLACE(%I, '[^a-zA-Z\d\s:/\//]', '', 'g') $dynsql$;
UPDATE_C constant text := $dynsql$ UPDATE autopipe.test SET %I = REGEXP_REPLACE(%I, '\s+$', '', 'g') $dynsql$;
col_name text;
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
execute format(UPDATE_A, col_name, col_name);
execute format(UPDATE_B, col_name, col_name);
execute format(UPDATE_C, col_name, col_name);
end loop;
end;
$$;
在如此巨大的 UPDATE
.
VACCUM