gpt4 book ai didi

sql - CHOOSE() 未按预期工作

转载 作者:行者123 更新时间:2023-12-04 12:54:11 27 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





How does this CASE expression reach the ELSE clause?

(3 个回答)


7年前关闭。




当我将随机整数生成与 CHOOSE() 结合使用时出乎我的意料NULL值。

以下应该只返回字母 a - e , 而是 NULL也包含在值中:

查询:

;WITH cte AS (SELECT 1 RN
UNION ALL
SELECT RN + 1
FROM cte
WHERE RN < 100)
SELECT DISTINCT CHOOSE(1 + ABS(CRYPT_GEN_RANDOM(8)%5),'a','b','c','d','e','f')
FROM cte

结果:
NULL
a
b
c
d
e

预期结果:
a
b
c
d
e

随机数生成按预期工作,仅返回值 1-5:
;WITH cte AS (SELECT 1 RN
UNION ALL
SELECT RN + 1
FROM cte
WHERE RN < 50)
SELECT 1 + ABS(CRYPT_GEN_RANDOM(8)%5)
FROM cte

演示: SQL Fiddle
CHOOSE()工作原理如下(索引从 1 开始):
SELECT CHOOSE(3,'dog','cat','horse','fish')  
-- horse
SELECT CHOOSE(8,'dog','cat','horse','fish')
-- NULL

在函数中使用随机数生成适用于 LEFT() , RIGHT() , CHAR() ,等等。
一个解决方法会很好,但主要是我很好奇为什么我得到 NULL值。

最佳答案

这很奇怪,可能属于错误类别。当然,您所做的事情很奇怪,因为您将位的随机模式视为数字。应该是有效的,但可能会出现意想不到的后果。而且,这不是溢出问题。它与 8 的其他值一起发生.

见证以下内容(在 SQL Fiddle 上):

WITH cte AS (SELECT 1 RN
UNION ALL
SELECT RN + 1
FROM cte
WHERE RN < 100)
SELECT CHOOSE(1 + ABS(n),'a','b','c','d','e','f'),
CHOOSE(1 + abs(CRYPT_GEN_RANDOM(8)%5),'a','b','c','d','e','f')
FROM (select abs(CRYPT_GEN_RANDOM(8)%5) as n
from cte
) n
order by 1

第一列永远不会 NULL .第二列是周期性的 NULL .换句话说,如果您将值分配给另一个变量会有所不同。我可以想象一些 8 字节大整数的模式代表 NaN,但这种情况不会发生太多。

鉴于它在直接调用时失败但在有中间变量时工作,我得出的结论是这可能是某种错误。我想知道它是否在某处记录。

关于sql - CHOOSE() 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23768908/

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