簡體   English   中英

無法將PostgreSQL表列從varchar類型轉換為int

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM