在名为my_table
的Postgres表中,我想将所有变量的所有空字符串(''
)设置为null
。我有以下do-block在执行行失败。
我对plpgsql
很新,不明白为什么。
如何正确执行q
中存储的命令?
do language plpgsql
$$
DECLARE
r record;
q text;
BEGIN
for r in
select table_name, column_name
from information_schema.columns t
where t.table_name = 'my_table'
loop
q := format('UPDATE %s SET %s = NULL WHERE %s = '''';',
r.table_name, r.column_name, r.column_name);
raise notice 'cleaning column: %', q;
execute q; -- this line fails
end loop;
END;
$$;
PS。还欢迎提供更好代码的任何其他提示:)
答案 0 :(得分:2)
对于非文本列(例如整数id
)查询
UPDATE id SET id = NULL WHERE id = ''
会引发错误,因为您无法将整数id
与文本进行比较。
使用强制转换文字:
...
q := format('UPDATE %I SET %I = NULL WHERE %I::text = '''';',
r.table_name, r.column_name, r.column_name);
...
作为替代方案,您只能对文本列执行更新查询,例如:
...
select table_name, column_name
from information_schema.columns t
where t.table_name = 'my_table'
and data_type in ('text', 'character varying')
...