2017-10-10 87 views
1

我正在嘗試在integer字段上運行簡單的UPDATE腳本,從而尾隨的2個數字「保留」,並刪除前導數字。例如,「0440」將更新爲「40」。我可以在SELECT聲明中得到想要的數據,如帶有整數字段的UPDATE語句中的RIGHT函數

SELECT RIGHT(field_name::varchar, 2) 
FROM table_name; 

不過,我碰到一個錯誤,當我嘗試在UPDATE腳本中使用了相同的功能,如:

UPDATE schema_name.table_name 
SET field_name = RIGHT(field_name::varchar, 2); 

我收到的錯誤消息是:

列。 。 。是整數類型,但表達式是文本類型。 。 。 提示:你將需要重寫或鑄表達

+0

對於澄清,是'FIELD_NAME你的表中有'int'或'varchar'列嗎? –

+0

@ChrisJ:標題和錯誤消息說'整數'(儘管問題文本有點誤導)。 –

+1

這個問題似乎太明顯了,所以我認爲它是值得澄清 –

回答

0

你鑄造整數爲varchar,但你不投結果返回到整數。

UPDATE schema_name.table_name 
SET field_name = RIGHT(field_name::TEXT, 2)::INTEGER; 
0

的錯誤是相當簡單 - right返回文本數據,你不能分配到一個整數列。你可以,但是,明確地將它轉換回:

UPDATE schema_name.table_name 
SET field_name = RIGHT(field_name::varchar, 2)::int; 
0

1數字(或者一個數字 - 或者一個字符串), '123' 是一個(或字符串)。

您的示例0440對於integer值沒有意義,因爲未存儲前導(無意義)0

嚴格地說數據類型integer沒有好的「後2號」存儲 - 意味着數字 - 因爲000都產生相同的整數值0。但我不認爲這就是你的意思。

有關數值操作,不要使用字符串函數(這需要鑄造來回modulo operator %做你所需要的,正是:。field_name%100所以:

UPDATE schema_name.table_name 
SET field_name = field_name%100 
WHERE field_name > 99; -- to avoid empty updates