根据条件更改临时表的值

时间:2019-07-15 00:16:33

标签: sql amazon-redshift

我正在使用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'。
我怀疑原因是当它在第一个条件下失败时,而在第二个条件内,转换函数不能采用非数字值,从而引发了错误。但是我不确定如何解决这个问题并得到我想要的。 有什么建议么 ?谢谢

1 个答案:

答案 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}$'