使用Postrgres plpgsql执行存储在文本变量中的动态SQL查询

时间:2016-11-13 11:32:07

标签: postgresql plpgsql dynamic-sql

在名为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。还欢迎提供更好代码的任何其他提示:)

1 个答案:

答案 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')
...