【发布时间】:2021-12-25 01:24:09
【问题描述】:
SELECT
r.[value] as KnownRandomNumber,
CHOOSE(r.[value], 5, 15, 16, 17) AS KnownRandomResult,
CHOOSE(FLOOR(RAND() * 4) + 1, 5, 15, 16, 17) AS UnknownRandomResult
FROM
(SELECT FLOOR(RAND() * 4) + 1 AS [value]) r
为什么CHOOSE(FLOOR(RAND() * 4) + 1, 5, 15, 16, 17) 有时会返回 null?即使使用从子查询中获得的随机数永远不会返回null?
我在 SQL Server Management Studio 的 Microsoft SQL Server 上运行它。
【问题讨论】:
-
CHOOSE(x, a, b, c)是CASE WHEN x = 1 THEN a WHEN x = 2 THEN b WHEN x = 3 THEN c END的简写,x对每个CASE进行单独评估。如果驱动CHOOSE的表达式是不确定的(包括RAND(),但不包括列引用),则结果可以是任何内容,包括不匹配大小写。此处的文档完全没有提及这一点是错误的,但如果您获取执行计划,它会立即可见。 -
谢谢!有道理,这消除了混乱。
-
实际上 - 选择是简单案例表达式的简写。这将是:CASE X WHEN 1 THEN a WHEN 2 THEN b WHEN 3 THEN c END。无论哪种方式 - 如果没有找到匹配项,则返回 NULL。
-
我猜想将 rand 与 choose 一起使用的问题在于,选择变成:当 rand() =1 然后 {a} 当 rand()=2 然后 {b} ...并且每次检查都会生成随机数......这可能会混淆“选择”函数并使其有时返回 null ,因为该函数不是用来处理非确定性函数作为输入
-
@Jeff: ...但是一个简单的
CASE表达式本身是“完整”CASE表达式的简写,这实际上是引擎支持的所有内容。归根结底,任何涉及CASE的事情最终都会多次评估输入表达式,而CHOOSE恰好是该策略的另一个受害者。
标签: sql sql-server database random