2017-10-10 90 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