sql - T-SQL 查询在声明整数与计算查询时给出不同的结果

标签 sql sql-server random

所以我一直在尝试在查询中生成一些 SQL 随机数,我发现有些奇怪。

假设我运行以下查询:

declare @Random int = CAST(RAND(CHECKSUM(NEWID())) * 5 as INT) + 1;

select CHOOSE(@Random,'One','Two','Three','Four','Five')

SQL 随机数 gen 有点庞大,但这里的基本思想很简单 - 选择 1 到 5 之间的随机数,然后将该数字作为文本显示到选择窗口。这按预期工作。

但是,如果我采用 SAME 查询,但将随机数公式粘贴到方法中,而不是将其声明为整数,那么它就在一行中:

select CHOOSE(CAST(RAND(CHECKSUM(NEWID())) * 5 as INT) +
    1,'One','Two','Three','Four','Five')

当我运行查询时,我仍然会得到值 1 到 5,但有时我也会得到 NULL。 NULL 经常出现,大约五分之一。如果我将两个查询都放入 ssms 并彼此相邻运行几次,我经常会看到第二个查询为空值,但第一个永远不会为 NULL。

那是为什么呢?这些不是完全相同的计算吗?我不知道为什么这两个查询会给出不同的结果,但我觉得我可以通过找出来学习一些关于 T-SQL 的有用的东西。

有哪位高手能指教一下吗?

最佳答案

这是 SQL Server 中 choose 函数的一个非常微妙的问题(嗯,微软可能认为它是一个特性)。该函数实际上是 case 表达式的简写。所以,你的表情:

select CHOOSE(CAST(RAND(CHECKSUM(NEWID())) * 5 as INT) +
1,'One','Two','Three','Four','Five')

翻译成:

select (case when CAST(RAND(CHECKSUM(NEWID())) * 5 as INT) + 1 = 1 then 'One'
             when CAST(RAND(CHECKSUM(NEWID())) * 5 as INT) + 1 = 2 then 'Two'
             when CAST(RAND(CHECKSUM(NEWID())) * 5 as INT) + 1 = 3 then 'Three'
             when CAST(RAND(CHECKSUM(NEWID())) * 5 as INT) + 1 = 4 then 'Four'
             when CAST(RAND(CHECKSUM(NEWID())) * 5 as INT) + 1 = 5 then 'Five'
        end)

这意味着 newid() 被多次调用。这通常不是您想要的行为。

关于sql - T-SQL 查询在声明整数与计算查询时给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25769897/

相关文章:

javascript - 寻找随机选择、连接存储在变量中的文本字符串

mysql - 每个属性值的 SQL 最大值

sql - 如何对 SQL 表中的连续时间戳进行分组?

c# - 在 SQL LIKE 子句中使用 SqlParameter 不起作用

mysql - UNIQUE 约束与 INSERT 之前的检查

java - 生成必须包含字母、数字和特殊字符(6-10 位数字)的随机字符串

python - 从 .txt 文件中选择随机分数并找到它们的平均值 (Python)

mysql - 使用 where 子句从另一个表中选择数据

sql - 根据条件选择相同列作为不同列

sql-server - 将日期时间评估为时间窗口