gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 21:10:19 25 4
gpt4 key购买 nike

所以我一直在尝试在查询中生成一些 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com