2010-05-21 119 views
6

我在我的Postgres數據庫中有一個Varchar類型的列,我的意思是整數...現在我想改變它們,不幸的是這似乎不是使用我的rails遷移工作。如何將表列轉換爲另一種數據類型

change_column :table1, :columnB, :integer 

這似乎輸出這個SQL:

ALTER TABLE table1 ALTER COLUMN columnB TYPE integer 

所以我試着這樣做:

execute 'ALTER TABLE table1 ALTER COLUMN columnB TYPE integer USING CAST(columnB AS INTEGER)' 

但由於一些列的爲空轉換並不在這種情況下工作...

有什麼想法嗎?

錯誤:

PGError: ERROR: invalid input syntax for integer: "" 
: ALTER TABLE table1 ALTER COLUMN columnB TYPE integer USING CAST(columnB AS INTEGER) 

的Postgres V8.3

+0

其Postgres的版本?這對我很有用 – ealdent 2010-05-21 11:59:13

+0

btw:什麼不適用於遷移? – 2010-05-21 22:13:20

回答

13

這聽起來像問題是,你必須在你的桌子空字符串。你需要處理那些可能與一個case語句,如:

execute %{ALTER TABLE "table1" ALTER COLUMN columnB TYPE integer USING CAST(CASE columnB WHEN '' THEN NULL ELSE columnB END AS INTEGER)}

更新:根據最新的問題完全重寫。

+0

我拿出報價,並嘗試使用coalesce,但我只得到「PGError:錯誤:列」0「不存在」 – holden 2010-05-21 12:36:51

2

NULLs不應該是一個問題在這裏。 告訴我們您的postgresql版本和您的錯誤消息。 此外,你爲什麼要引用標識符?請注意,未加引號的標識符會轉換爲小寫(默認行爲),因此您的查詢中的「columnB」可能存在問題 - 它首先顯示爲引號,未在引用中加引號。

更新:在將列轉換爲整數之前,您必須確保所有值都是可轉換的。在這種情況下,這意味着columnB應該只包含數字(或null)。 您可以通過類似

select columnB from table where not columnB ~ E'^[0-9]+$'; 

如果你想轉換的空字符串爲NULL整數檢查這一點,那麼您使用的運行第一

UPDATE table set columnB = NULL WHERE columnB = ''; 
+0

最後postgresql版本是8.4.4 – leonbloy 2010-05-21 13:23:12

+0

對不起,我的意思是8.3(postgresql83);-) – holden 2010-05-21 13:26:36

相關問題