更改PostgreSQL 9.6中某种数据类型的表中的所有列

时间:2017-09-19 18:30:12

标签: sql database postgresql

似乎几个月前我遇到了一个涉及此问题的SO问题,但我现在似乎无法找到它。

基本上,我想做两件事。

首先,使用多个列numeric(20,2)创建了许多表格,我想将它们全部更改为numeric。该陈述对于一列来说非常简单:

ALTER TABLE table_name
ALTER COLUMN code
TYPE numeric;

照顾好。

其次,在这些列上,我想删除任何尾随零:

UPDATE table_name
SET code = replace(replace(code::text, '.50', '.5'), '.00', '')::numeric;

难以弄清楚如何自动化它所以我只需要指定表,它就会清理表。很确定这是可能的。

1 个答案:

答案 0 :(得分:5)

您可以使用以下语句找到包含要更改的数据类型的所有列:

select column_name, table_name
from information_schema.columns
where data_type='numeric'
    and numeric_precision = 20
    and numeric_scale = 2;

您可以使用自定义函数或DO命令(例如:

)迭代结果
do $$
begin
    for t IN select column_name, table_name
            from information_schema.columns
            where data_type='numeric'
                and numeric_precision = 20
                and numeric_scale = 2;
    loop
        execute 'alter table ' || t.table_name || ' alter column ' || t.column_name || ' type numeric';
    end loop;
end$$;

此外,要删除尾随零,更通用的解决方案是将值转换为float或double precision,然后再转换为numeric,例如:

set code = cast(cast(code as double precision) as numeric);