我在本网站的其他地方看到了类似的问题,但在优化的背景下更多。
我遇到了WHERE子句中条件执行顺序的问题。我有一个存储代码的字段,其中大部分是数字,但其中一些包含非数字字符。我需要对数字代码执行一些操作,如果尝试非数字字符串,将导致错误。我正在尝试做类似
的事情WHERE isnumeric(code) = 1
AND CAST(code AS integer) % 2 = 1
有没有办法确保isnumeric()先执行?如果没有,我收到错误......
提前致谢!
答案 0 :(得分:5)
唯一保证评估的地方是CASE
WHERE
CASE WHEN isnumeric(code) = 1
THEN CAST(code AS integer) % 2
END = 1
另外,因为它通过isnumeric
测试并不能保证它会成功cast
到一个整数。
SELECT ISNUMERIC('$') /*Returns 1*/
SELECT CAST('$' AS INTEGER) /*Fails*/
根据您的需要,您可能会发现these alternatives更为可取。
答案 1 :(得分:1)
为什么不简单地使用LIKE?:
Where Code Not Like '%[^0-9]%'
顺便说一句,无论是使用我的解决方案还是使用IsNumeric,都有一些边缘情况可能导致人们使用UDF,例如1,234,567
,其中IsNumeric将返回1但Cast会抛出异常。
答案 2 :(得分:0)
为什么不使用CASE语句来说出类似的内容:
WHERE
CASE WHEN isnumeric(code) = 1
THEN CAST(code AS int) % 2 = 1
ELSE /* What ever else if not numeric */ END
答案 3 :(得分:0)
您可以在case
子句中的select
语句中执行此操作,然后使用外部select
中的值进行限制
select * from (
select
case when isNum = 1 then CAST(code AS integer) % 2 else 0 end as castVal
from (
select
Case when isnumeric(code) = 1 then 1 else 0 end as isNum
from table) t
) t2
where castval = 1