似乎几个月前我遇到了一个涉及此问题的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;
难以弄清楚如何自动化它所以我只需要指定表,它就会清理表。很确定这是可能的。
答案 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);