当前位置: 首页 > 面试题库 >

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

谯灿
2023-03-14
问题内容

因此,我一直在尝试在查询中生成一些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的有用信息。

任何专家都想启发我吗?


问题答案:

这是chooseSQL
Server中功能的一个非常微妙的问题(好吧,Microsoft可能会将其视为功能)。该函数实际上是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()多次被调用。这通常不是您想要的行为。



 类似资料:
  • 问题内容: 这是一个有关使用haversine公式计算地球上两个纬度和经度之间的距离的问题,用于需要“查找我最近的”功能的项目中。 haversine公式很好地讨论并在MySQL解决了这个帖子。 然后,我问了一个有关将其转换为存储函数的问题,这样它就可以在以后的项目中使用,而不必查找,记住或重新键入长格式的公式。 都很好。除了我的函数的结果(略有不同)以外,其他条件相同时,直接在查询中直接键入公式

  • 主要内容:带有 SELECT 语句的子查询,带有 INSERT 语句的子查询,带有 UPDATE 语句的子查询,带有 DELETE 语句的子查询子查询与其他 SQL Server 查询一起使用并嵌入 WHERE 子句。子查询用于返回数据,在主问题中用作限制要检索的数据的条件。 子查询与语句 SELECT、INSERT、UPDATE 和 DELETE 一起使用,并带有运算符 、、、、、 和 等。 子查询遵循的规则很少 - 子查询括在括号中。 子查询包括 FROM 子句和 SELECT 子句。 子查

  • 问题内容: 在SQL中按月将一列中的1-12连接到一堆计数的好方法是什么?…在​​SQL中 最终会像 编辑-基本上是一种获取我的月份列表/表格/任何内容的巧妙方法 问题答案: 许多方法…在上一份工作中对许多应用程序来说对我来说效果很好的一种方法是建立时间表。 然后,您可以将其日期字段放在startstamp和endstamp之间的timeframes表中进行联接。 这样可以很容易地拉出某个时间段或

  • 在程序中有一部分代码,用于执行查询: 数据集 () 表应该有大约 20000 条记录(行计数),但在程序内部,它在调试模式下说只有 20 条记录。 我在同一个数据库表上单独运行了脚本,该表在 SQL Server 连接字符串中使用,但在 SQL Server Management Studio 中,它按预期返回了 20000 条记录。 该脚本看起来像: 它是相同的脚本文本,代码也会执行该文本。 有

  • 问题内容: 我们如何在T-SQL中编写递归SQL查询?您能举一个这样的递归sql查询的简单例子吗? 问题答案:

  • 问题内容: 基于现有表,我使用了CTE递归查询来得出以下数据。但是无法进一步应用它。 数据如下 我想从上述数据递归形成完整路径。意味着递归将给出以下输出。 谢谢 问题答案: 以下是CTE的示例: