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

2024-02-25

所以我一直在查询中尝试一些 SQL 随机数生成,并且我注意到一些奇怪的事情。

假设我运行以下查询:

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

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

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

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

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 中的函数(好吧,微软可能认为它是一个功能)。该函数实际上是 a 的简写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()被多次调用。这通常不是您想要的行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

声明整数与计算查询中的 T-SQL 查询给出不同的结果 的相关文章

随机推荐

  • 在 R 中创建空间集群 LISA 地图

    我想创建一张显示现象的局部空间集群的地图 最好使用局部莫兰 LISA 在下面的可重现示例中 我使用以下方法计算本地莫兰指数spdep但我想知道是否有简单的方法来映射簇 最好使用ggplot2 Help library UScensus200
  • 即使添加控制台插件后,console.log 在 iOS Phonegap 应用程序中也不起作用

    我在 Cordova CLI 中创建了一个 Phonegap iOS 应用程序 我已经添加了控制台插件 是的 deviceready 被成功调用 但是 console log 不起作用并且不会在 XCode 日志中打印任何内容 插件安装 科
  • AWS X-Ray GoLang Lambda 到 lambda 跟踪并显示在服务地图中

    我有一个 API 网关 它在 Go 中调用 Lambda 函数 1 和 Lambda 函数 2 我想看到这两个函数加入到服务映射中 到目前为止 我能够做到这一点的唯一方法是创建一个自定义分段 例如称为 父级 并从此上下文创建一个子分段 例如
  • 无法让 pip install 在 EMR 集群上运行

    我有一个 EMR emr 5 30 0 集群 我尝试从 S3 中的引导文件启动 引导程序文件的内容是 bin bash sudo pip3 install user matplotlib pandas pyarrow pyspark 我的
  • Android 4.4 KitKat 未收到 cookie

    在我的应用程序中 我向服务器发送 POST 请求 并从服务器接收响应 我从响应中收集了不同的 cookie 特别是用户信息 因此 我发送登录请求并在服务器响应后接收 cookie 以保持登录 在 Android 4 3 及更低版本中 我可以
  • Web 服务作为 JAR 文件,还是另一个 WAR 中的 WAR?

    我有一个在 Tomcat 6 上运行的 SOAP Web 服务 使用 Spring Web Services Java 现在我想将此 Web 服务合并到另一个大型 Web 应用程序中 使用 Spring Java 而不是 Web 服务 并使
  • 如何使用 mDNS 将所有子域路由到单个主机?

    我有一个开发网络服务器托管为 myhost local 它是使用 Bonjour mDNS 找到的 服务器正在运行 avahi daemon 网络服务器还希望处理其自身的任何子域 例如 cat myhost local 和 dog myho
  • 如何在Java中将一个双精度数按点分割成两个十进制数?

    尝试按点将双精度数分成两个小数部分 像这样 1 9变成1和9 0 16分为0和16 这就是我所做的 但似乎有点多余 最好的方法是什么 原始编号始终为 Just 0 x 或 1 x 或 0 xx 或 1 xx 且 xx gt 10 doubl
  • 从 KeyMembers 中获取身份字段

    我想得到KeyMembers我在 Edmx 中设置的位置StoreGeneratedPattern to Identity有没有办法做到这一点 我可以使用以下代码获取 KeyMembers private static IEnumerabl
  • Flink 中的水印和触发器有什么区别?

    我读到 排序运算符必须缓冲它接收到的所有元素 然后 当它接收到水印时 它可以对时间戳低于水印的所有元素进行排序 并按排序顺序发出它们 这是正确 因为水印表明不能有更多元素到达并与已排序元素混合 https cwiki apache org
  • 在 Ansible 中使用 BuildKit 进行 docker 构建

    我正在使用这个 Ansible 模块community docker docker image构建 docker 镜像 我想用 secret标志 因此我需要启用 BuildKit 我确实编辑了 etc docker daemon json文
  • 使用 Python 从 Javascript 中提取文本

    我一直在查看如何执行此操作的示例 但不太明白 我正在使用 beautifulsoup 来抓取一些数据 我可以使用它来查找我想要的数据 但它包含在以下代码块中 我正在尝试从中提取时间戳信息 我有一种感觉正则表达式在这里工作 但我似乎无法弄清楚
  • 添加 ec2 实例时使用现有的 vpc 和安全组

    有很多示例代码 但是快速改进的 cdk 包并不能帮助我找到一些 我认为 简单事物的工作示例 例如 即使我在示例中发现的导入也会失败 import VpcNetworkRef from aws cdk aws ec2 error TS2724
  • 在运行时将 char[x] 大小调整为 char[y]

    好吧 我希望我能正确解释这一点 我有一个结构 typedef struct MyData char Data 256 int Index MyData 现在 我遇到了一个问题 大多数时候MyData Data256 就可以了 但在某些情况下
  • JavaFX - 如何在 fxml 控制器初始化期间设置值

    我尝试加载 FXML 并使用 Java 代码 而不是使用 FXML 标签 设置控制器 我在 FXML 中有不同的字段 我尝试加载 例如文本字段 按钮 这是示例 Tab tab new Tab tab setText TesetTabAdd
  • Twitter bootstrap 3 Modal 带淘汰赛

    我正在尝试将 twitter bootstrap 模式与淘汰赛完全绑定 通过完全绑定 我的意思是我希望与模式对话框的每一次密切交互都能与淘汰赛一起使用 我见过一些问题 https stackoverflow com q 18370489 1
  • 通过基准测试中的注释加载应用程序上下文

    假设我想写一个benchmark对于该类可以是autowired因此我需要加载application context 我的测试有注释 org openjdk jmh annotations State Scope Benchmark 和主要
  • 通过服务进行 ASP.NET 成员身份验证

    客观的 我想创建一个 Web 服务 允许我连接到它 通过 ASP NET Web 应用程序 然后像成员资格提供者 角色提供者那样对用户进行身份验证 我不想通过在 ASP NET Web 应用程序的 Web config 中进行配置来使用成员
  • 如何找到 SVN 存储库目录?

    我知道网址在哪里 localhost svn BodyMap 是 但我不知道它在我的 Windows 7 设置中的哪个文件夹中 如果有帮助的话 它应该是一个标准的 SVN 设置 我不记得用它做过任何 聪明 的事情 我想我的意思是 我有代码
  • 声明整数与计算查询中的 T-SQL 查询给出不同的结果

    所以我一直在查询中尝试一些 SQL 随机数生成 并且我注意到一些奇怪的事情 假设我运行以下查询 declare Random int CAST RAND CHECKSUM NEWID 5 as INT 1 select CHOOSE Ran