例如下面的Employee表
Eno | Ename | Ecode | Edept |
1 | Allen | abc | Sales |
2 | Max | 102 | Marketing |
3 | Ward | 55 | Mark |
4 | Sam | xyz | Sales |
select * from Employee where Edept like 'M%' and CAST(Ecode as Int)>100
然而,上面的查询结果错误:
在将 varchar 值 'abc' 转换成数据类型 int 时失败。
查询失败的原因正是前面所指出的,没有规定执行谓词的顺序。在这种情况下,第二谓词直接求值首先导致转换错误。
相反使用CASE表达式,这里将保证只有合法的数据将被转换为int类型:
select * from Employee where Edept like 'M%' and CASE WHEN Ecode not like '%[^0-9]%' then CAST(Ecode as Int) END>100