这个问题在这里已经有了答案:
How does this CASE expression reach the ELSE clause?
(3 个回答)
5年前关闭。
在 case 语句中运行模函数时,很多时候会返回超出预期范围的值。
SELECT CASE WHEN ABS(CheckSUM(NewId())) % 5 IN (0,1,2,3,4) then NULL
ELSE 'What Happened?' END
如果您多次运行此脚本,您会看到结果有时会超出 0、1、2、3、4 的范围。我的想法是,这在 case 语句中以某种方式返回了非整数值,导致模数成为一种无效的按大小写排序方法。
有人可以解释在这些情况下发生了什么,以便我将来可以解决这个问题吗?
注意:如果我自己运行代码模函数(在 case 语句之外)并返回结果,所有值都在 0、1、2、3、4 的范围内,如预期的那样。
最佳答案
将您的声明更改为
SELECT top(1)
CASE WHEN ABS(CheckSUM(NewId())) % 5 IN (0,1,2,3,4) then NULL
ELSE 'What Happened?' END
并查看实际执行计划。
IN
案例中的一部分被扩展到。CASE WHEN abs(checksum(newid()))%(5)=(4) OR
abs(checksum(newid()))%(5)=(3) OR
abs(checksum(newid()))%(5)=(2) OR
abs(checksum(newid()))%(5)=(1) OR
abs(checksum(newid()))%(5)=(0)
THEN NULL
ELSE 'What Happened?'
END
abs(checksum(newid()))%(5)
对 in 子句中的每个值执行一次。
关于sql-server - SQL Server Modulo 函数似乎返回超出预期范围的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35163902/