![](/img/trans.png)
[英]How to convert column type from varchar to date in PostgreSQL?
[英]Can't convert postgresql table column from type varchar to int
我有一個數據庫表,用於存儲從網絡蜘蛛返回的數據。 我有一列,其中包含所有變化形式為varchar的不同事件的門票價格(因為抓癢的蜘蛛必須抓取unicode中的數據)。 我試圖返回列的最低價格,並且由於min()函數僅適用於INT類型的數據,因此我嘗試使用此SO post的解決方案將列轉換為整數:
ALTER TABLE vs_tickets ALTER COLUMN ticketprice TYPE integer USING (ticketprice::integer);
但我得到了錯誤: 錯誤:整數的無效輸入語法:
我也嘗試過: change_column :vs_tickets, :ticketprice, 'integer USING CAST(ticketprice AS integer)'
但這也不起作用。
將列轉換為INT的正確方法是什么?
您在字符串中使用小數位,因此無法進行簡單的強制轉換。 您可以進行兩次轉換:
cast(cast(ticketprice as decimal(10, 2)) as int)
要么:
(ticketprice::decimal(10, 2))::int
(絕對不是必須的。)
編輯:
或者,正如Erwin指出的那樣,只使用numeric
:
(ticketprice::numeric)::int
與大多數其他數據庫相比,Postgres在numeric
方面要聰明得多。 。 。 畢竟,它支持的數字非常大;)
最終查詢是:
ALTER TABLE vs_tickets
ALTER COLUMN ticketprice TYPE integer USING (ticketprice::numeric::integer);
我敢打賭,你的專欄字符有誤。 另外,您可能需要使用浮點數或數字,因為如果轉換為整數,將會丟失小數。
您需要創建一個函數來檢查文本是否為數字,例如isnumeric-with-postgresql
然后像這樣檢查每一行
select ticketprice
from vs_tickets
where ISNUMERIC(ticketprice) = false;
作為您的評論,您還應該嘗試
SELECT ticketprice::float
最好添加一個INT列,使用強制轉換移動數據,然后刪除舊的varchar列。
ALTER TABLE vs_tickets ADD COLUMN ticketprice_int TYPE int;
GO
update vs_tickets SET ticketprice_int = cast(ticketprice as int);
// if you fail to cast the varchar to int you can use Gordon's method
// update vs_tickets SET ticketprice_int = cast(cast(ticketprice as decimal(10, 2)) as int);
GO
ALTER TABLE vs_tickets DROP COLUMN ticketprice;
GO
ALTER TABLE vs_tickets RENAME COLUMN ticketprice_int to ticketprice;
GO
至少使用此功能,您將能夠確定強制轉換是否在何時何地失敗,並可以在每個步驟中進行檢查和重新檢查,然后再返回。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.