2017-09-19 43 views
1

幾個月前,我似乎遇到了一個覆蓋此問題的SO問題,但我現在似乎無法找到它。在PostgreSQL中更改某個數據類型的表中的所有列9.6

基本上,我想做兩件事。

首先,一些表格製作了幾列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; 

有困難如何自動運行它,所以我只需要指定表,它會清理桌子。很確定這是可能的。

回答

3

你可以找到所有你想要像一個語句更改與數據類型的列:

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$$; 

另外,以除去尾隨零,一個更通用的解決方案是投值背面浮動或雙精度,然後到數字,例如:

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

在數值數據類型中不存在類似於「尾隨零」的類似... – Abelisto

+0

'select cast('1234.50'as numeric);'將顯示尾隨零,而'select cast(cast(cast(' 1234.50'as numeric)as double precision)as numeric;)將顯示沒有結尾的零。 –

+0

啊,是的,我明白了。老實說,對我來說,'numeric'類型單獨保存每個值的初始精度是令人驚訝的。謝謝你指點我。 – Abelisto

相關問題