sql-server - SQL Server Modulo 函数似乎返回超出预期范围的值

标签 sql-server modulo

这个问题在这里已经有了答案:





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/

相关文章:

带有allowCustomSqlDatabase ="true"的ASP.NET SessionState不调用指定的数据库

c# - 命名空间 System.Configuration 中不存在 configurationManager

sql - 从 SQL Server 中的文本中提取数字

time - 返回带模数的时间分量

C++ - 无符号整数的模

c# - SQL Server 插入

c# - 使用 NHibernate 插入失败后 SQL 不可用

java - 求取模结果的正确方法

r - 如何向量化模数?

c - 如何让 C 查看文件并找到某个字符串?