我正在使用Amazon redshift,需要在如下所示的临时表中更改名为“代码”的列的值。
id code
--- ----
1 99990
2 A0002
3 0000F
我需要检查第一个和最后一个字符是否为数字,如果它们都随后根据其范围更改列值(例如,当90000
如果最后一个字符是字母,则根据前4个字符的范围设置代码(例如,当0
我现在拥有的是:
UPDATE tmp_table
SET code = 'category1'
WHERE substring(code,1,1) ~ '[0-9]'
AND 90000 <= CONVERT(INT,code) <= 99999 ;
但是,我收到类似'A0002'这样的代码的错误,错误消息是:无效的操作,无效的数字,值'A'。
我怀疑原因是当它在第一个条件下失败时,而在第二个条件内,转换函数不能采用非数字值,从而引发了错误。但是我不确定如何解决这个问题并得到我想要的。
有什么建议么 ?谢谢
答案 0 :(得分:0)
表达式的计算顺序不确定。可以按任何顺序对其进行评估。
要解决此问题,请使用case
:
UPDATE tmp_table
SET code = 'category1'
WHERE (CASE WHEN code ~ '[0-9]+'
THEN CONVERT(INT, code) BETWEEN 90000 AND 99999
END);
或者,忘记转换,而只使用字符串逻辑:
WHERE CODE ~ '^9[0-9]{4}$'