T-SQL Case 语句以 newid() 作为随机源的奇怪行为

2023-11-25

我正在使用 SQL Server 2012。

如果我执行以下操作来获取 [1,3] 范围内的随机数字列表,则效果很好:

SELECT TOP 100 
    ABS(CHECKSUM(NEWID()))%3 + 1 [value_of_rand]
FROM sys.objects

我得到了这样的好东西(都在 1 到 3 之间)。

3
2
2
2
1
....etc.

但是,如果我随后将同一个链式随机值函数的输出放入 CASE 语句中,它显然不会仅产生值 1、2、3。

SELECT TOP 100 
    CASE (ABS(CHECKSUM(NEWID()))%3 + 1)
        WHEN 1
            THEN 'one'
        WHEN 2
            THEN 'two'
        WHEN 3
            THEN 'three'
        ELSE
            'that is strange'
    END [value_of_case]
FROM sys.objects

它输出:

three
that is strange
that is strange
one
two
...etc

我在这里做错了什么?


Your:

SELECT TOP 100 
    CASE (ABS(CHECKSUM(NEWID()))%3 + 1)
        WHEN 1
            THEN 'one'
        WHEN 2
            THEN 'two'
        WHEN 3
            THEN 'three'
        ELSE
            'that is strange'
    END [value_of_case]
FROM sys.objects

实际执行:

SELECT TOP 100 
    CASE 
        WHEN (ABS(CHECKSUM(NEWID()))%3 + 1) = 1  THEN 'one'
        WHEN (ABS(CHECKSUM(NEWID()))%3 + 1) = 2  THEN 'two'
        WHEN (ABS(CHECKSUM(NEWID()))%3 + 1) = 3  THEN 'three'
        ELSE 'that is strange'
    END [value_of_case]
FROM sys.objects;

基本上你的表达是不确定的,每次都会被评估,所以你最终可以得到ELSE clause。所以不存在任何错误或陷阱,只需将它与变量表达式一起使用,这是完全正常的行为。

这是同一个班级COALESCE syntactic-sugar

COALESCE 表达式是 CASE 的语法快捷方式 表达。即代码COALESCE(表达式1,...n)被重写 由查询优化器将其定义为以下 CASE 表达式:

CASE

WHEN (表达式 1 IS NOT NULL) THEN 表达式 1

WHEN (表达式2 IS NOT NULL) THEN 表达式2

...

ELSE 表达式

END

这意味着输入值 (表达式1, 表达式2, 表达式N等)将被评估多次。另外,在 符合SQL标准,包含一个值表达式 子查询被认为是非确定性的,并且子查询被评估 两次。无论哪种情况,都可能返回不同的结果 首次评估和后续评估.

EDIT:

解决方案:sqlfiddle

SELECT TOP 100 
    CASE t.col
        WHEN 1     THEN 'one'
        WHEN 2     THEN 'two'
        WHEN 3     THEN 'three'
        ELSE      'that is strange'
    END [value_of_case]
FROM sys.objects
CROSS APPLY ( SELECT ABS(CHECKSUM(NEWID()))%3 + 1 ) AS t(col)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

T-SQL Case 语句以 newid() 作为随机源的奇怪行为 的相关文章

  • 如何编写 T-SQL 查询来为每个客户端选择前 1 条记录?

    我有一个简单的脚本 我试图获取每个客户端的最新记录 我如何在 TSQL 中执行此操作 这是我目前的代码 但是 这只是总共选择了一条记录 此记录显示所有客户的最新记录 而不是每个客户 请问我该如何重新表述 SELECT TOP 1 C Cli
  • 使用 SQL 序数位置表示法的好处?

    背景资料 序数位置表示法 又称序数 是基于列列表中的列顺序的列简写 SELECT子句 而不是列名或列别名 通常支持在ORDER BY子句 某些数据库 MySQL 3 23 PostgreSQL 8 0 支持语法GROUP BY条款也是如此
  • 如何使用 REST API 导出 SSRS 2017 报告

    我已经设置了 SSRS 2017 我需要使用他们的新 REST API 导出 SSRS 报告 我一直在查看 API 规范here https app swaggerhub com apis microsoft rs SSRS 2 0但我在
  • 使用具有外键的表将数据从 asp.net 页面插入到我的数据库中

    我是一名初学asp net程序员 我的项目是网上购物课程 我有一些问题 我有 4 个表 它们之间有一些外键 CREATE TABLE dbo orderdetails orderid INT NOT NULL classid INT NOT
  • T-SQL中有异或运算符吗?

    这是我的声明 IF UserName IS NULL AND EditorKey IS NULL OR UserName IS NOT NULL AND EditorKey IS NOT NULL BEGIN RAISERROR One o
  • 存储过程 - 使用 NOT IN where 子句执行查询

    我有一个存储过程 Create PROCEDURE abc sRemovePreviouslySelectedWhereClause nvarchar max AS BEGIN SELECT FROM table WHERE nId NOT
  • 使用 Python 中的 SQL Server 存储过程 (pyodbc)

    我有一个存储过程 代码 DECLARE RC int DECLARE id varchar 13 DECLARE pw varchar 13 DECLARE depart varchar 32 DECLARE class varchar 1
  • Sql Server:如何在 WHERE 子句中使用 MAX 等聚合函数

    我想获得该记录的最大值 请帮我 SELECT rest field1 FROM mastertable AS m INNER JOIN SELECT t1 field1 field1 t2 field2 FROM table1 AS T1
  • 如何从经典 ASP 读取 SQL Always-加密列

    我维护一个经典的 ASP 应用程序 是的 我知道 我们正在开发它 并且需要访问 SQL 2017 中的 Always Encrypted 列 我已经导入了证书并在 SSMS 和 PowerShell 中进行了测试 这很有效 我在 ASP 中
  • 使用 Switch 的报告服务表达式

    我无法让这个表达式与报告服务一起使用 我必须使用 IF 和 ELSE IF 语句 感谢您的任何建议 Switch IsNothing Fields field date Value Fields set flag Value 1 Decli
  • 限制 SQL Server 连接到特定 IP 地址

    我想将 SQL Server 实例的连接限制为特定 IP 地址 我想阻止来自除特定列表之外的任何 IP 地址的任何连接 这是可以在 SQL Server 实例或数据库中配置的东西吗 听起来像是你会使用Windows防火墙 http tech
  • PDO SQLSRV 和 PDO MySQL 在获取 int 或 float 时返回字符串

    当您获取时 PDO MS SQL Server 和 PDO MySQL 都会返回一个字符串数组 即使列的 SQL 类型本应是数字类型 例如 int 或 float 我设法解决了这个问题 但我想了解为什么它们一开始就这样设计 是不是因为PDO
  • 获取家庭成员

    假设以下家庭 其构建架构是 create table PersonConn child int parent int insert into PersonConn values 1 2 insert into PersonConn valu
  • SQL Server 用分隔符分割字符串

    我有一个输入字符串 100 2 3 101 2 1 103 2 3 我想解析它并将其添加到具有 3 列的表中 因此它应该是 f x col1 col2 col3 100 2 3 类似的其他数据以逗号分隔作为记录和 作为列 Thanks ni
  • 快速转储 SQL Server 表

    我在 SQL Server 2008 R2 中有一个大表 它包含数十亿行 我需要在我们的应用程序中加载整个数据集 查询全表非常慢 我想使用 bcp 将其转储到文件中并加载它 但问题是字符串列包含各种特殊字符 如 t 0 逗号和 n 我找不到
  • SQL服务器事务

    我需要了解sql server事务 我浏览了谷歌上的一些文章 但我什么也没理解 谁能帮我 您可以通过写入显式启动事务BEGIN TRANSACTION 您可以通过运行来结束事务COMMIT TRANSACTION 之前COMMIT运行时 受
  • SQL Server,插入 Excel“链接服务器”时出现“无效列名”错误

    我有一个简单的 Excel 电子表格文档 运行 Office 2013 我使用 Microsoft Office 15 0 Access 数据库引擎 OLE DB 提供程序 将其用作数据库 我可以使用 MS SQL Server Manag
  • 避免连接失败时出现空指针

    我有我的域类 带有命名查询 class Atendimento implements Serializable Funcionario funcionario static mapping funcionario column FUNCOD
  • 如何在存储过程中实现 sql 搜索功能 (Sql Server 2008)

    我需要编写一个存储过程 该过程将使用 sql server 2008 根据可选参数搜索表 将会有两种模式 基本搜索模式 我们只传递一些文本 高级搜索模式 使用可选参数而不使用 SearchText 为了进行测试 我使用 AdventureW
  • 在 Sql Server 中转换为日期时间 MM/dd/yyyy HH:mm:ss

    如何将给定的日期格式转换为MM dd yyyy HH mm ss 我尝试了下面这个但没有实现 谁能帮我 SELECT CONVERT VARCHAR 20 GETDATE 120 SQL Server 2005及以上版本支持 SELECT

随机推荐

  • 在 onCreate() 中对 singleTask Activity 进行旧额外的意图

    例如 我创建了包含 2 个活动的项目 带有 android launchMode singleTask 标志的 FirstActivity 和 SecondActivity 首先 用户启动 FirstActivity 之后 SecondAc
  • 查询字符串反应路由器路径

    我正在使用react router 3 0 2并尝试使用查询字符串配置路由器路径 这就是我配置路由器的方式
  • 如何在 java 上更新 JSONArray 值

    谁能帮助我 我是java编程新手 假设我有 JSONArray 其中包含以下数据 STATUSUPDATE 0 IDSERV 2 STATUSUPDATE 0 IDSERV 3 STATUSUPDATE 0 IDSERV 1 如何更新STA
  • 在 jquery.ready 之后加载 javascript 文件

    我想在 jquery ready 末尾加载一个 javascript 文件 以便我的就绪处理程序中的代码不必等到加载这个大的 javascript 文件后才执行 我的 jquery ready 代码根本不依赖于这个 javascript 文
  • Google Maps API V3:如何获取区域边界坐标(折线)数据? [复制]

    这个问题在这里已经有答案了 我试图从 Google 地图获取 指定的 区域边界作为 GMaps 坐标 以形成折线 这在某种程度上可能吗 来自maps google com或我自己域中的我自己的GMap Note 我知道您可以使用专用工具手动
  • 制作半色调图像的算法?

    什么是制作半色调图像的好算法 例如this 快速谷歌搜索会带来一堆关于这个主题的论文 但很难判断哪些是好的 有效的等 有没有最好的选择来做这种事情 过滤至您想要的分辨率 想要将 点 分开 获取平均强度 该区域中的像素组 绘制点 使得曲面 点
  • C++ 类中对象计数的静态变量?

    我希望有一个静态成员变量来跟踪已创建的对象的数量 就像这样 class test static int count 0 public test count 这是行不通的 因为根据 VC 的说法 a member with an in cla
  • python 3.5 asyncio和aiohttp Errno 101网络无法访问

    我在 Ubuntu 16 上使用 python 3 5 我正在尝试使用 aiohttp 编写一个简单的客户端 这是我的代码 我把它从here 这是第一个代码示例 禁用了 ssl 检查 import aiohttp import asynci
  • 如何使单词边界 \b 与破折号不匹配

    我将代码简化为我遇到的具体问题 import re pattern re compile r bword b result pattern sub lambda x match word word 我正进入 状态 match match 但
  • 从屏幕中心获取位置 Swift MapKit

    我是 Swift 编程新手 我正在尝试构建一个应用程序 我可以使用 MapKit 和 Swift 2 获取视图中心的坐标 我已经可以获得当前位置 但如果我在地图上移动 我需要将位置设置为新点 该点将成为屏幕的中心 你能帮我解决这个问题吗 R
  • Swift 将每隔一个项目追加到数组中

    我有一个快速数组 Monthdata 我想将每个第二个值附加到我的月份数组中 var monthData let months Jul 12 Aug 12 Sep 12 Oct 12 for month in months self mon
  • 离开作用域时调用函数

    离开作用域时自动调用函数的最优雅的解决方案是什么 我目前的方法 见下文 works但我想应该有一些更通用的东西 比如为此编写一个自定义类 include
  • 为什么函数需要在定义或使用之前声明?

    在 C 中它是可选的 在C 中一 MUST 在使用 定义函数之前声明它 为什么会这样呢 有什么需要吗 我们不会在 C 或 Java 中这样做 有趣的是当我们在的时候defining一个函数 即使定义本身有一个声明 我们也需要声明 天知道为什
  • ActionScript 中的语法突出显示库

    我让用户在我的 Flex3 Flash 10 应用程序中输入一些代码 我想进行语法突出显示 有没有开源库可以帮助我 我需要 Lua 语法支持 但如果库有一个合理的接口来执行此操作 我可以自己添加它 2009 年 1 月 21 日更新 查看A
  • 如何本地化 Django 应用程序的内容

    嘿 我目前正在为我的学习开发一个 django 应用程序 并且已经到了 l18n 的地步 本地化网站本身非常容易 但现在我必须允许用户翻译应用程序的动态内容 用户可以将 产品 保存在数据库中并为其提供名称和描述 但由于整个站点应该本地化 因
  • R 在 Mac OS X Yosemite 中冻结

    我遇到了这个问题 并且没有关于如何解决这个错误的明确解释 每当我尝试保存使用 R 内部编辑器编写的文件时 OS X Mavericks 的最新版本 R v 3 1 2 就会在 Yosemite 中冻结 当您尝试时它也会冻结source一个函
  • 将 URL 解码为数组而不是字符串

    我目前正在使用 PayPals API 并希望将其响应之一从名称 值对转换为数组 到目前为止我已经用过urldecode 将响应解码为以下内容 email protected email protected MOREINFO lots mo
  • 如何跟踪和检查捆绑的 Ruby gem 中的依赖关系

    Bundler 将自动安装指定 gem 的任何依赖项 但它不会在标准输出中输出哪些依赖项映射到哪些 gem 当依赖项之一安装失败时 该信息非常有用 有没有办法将 Bundler 设置得更详细并在安装时告知依赖项 我正在使用 Bundler
  • DTE.执行命令并等待

    我想使用宏来发布我的网络应用程序项目 小问题是 DTE ExecuteCommand 异步运行 我需要等待命令完成 Example DTE Windows Item Constants vsWindowKindSolutionExplore
  • T-SQL Case 语句以 newid() 作为随机源的奇怪行为

    我正在使用 SQL Server 2012 如果我执行以下操作来获取 1 3 范围内的随机数字列表 则效果很好 SELECT TOP 100 ABS CHECKSUM NEWID 3 1 value of rand FROM sys obj