【发布时间】:2015-05-05 13:24:22
【问题描述】:
根据this post,SQL Server中生成随机值的正确方法是:
ABS(CHECKSUM(NewId())) % 14 -- Returns a value between 0 and 13
但是,当在 case 语句中使用此表达式时,例如:
SELECT
CASE ABS(CHECKSUM(NEWID())) % 4
WHEN 0 THEN 'String A'
WHEN 1 THEN 'String B'
WHEN 2 THEN 'String C'
WHEN 3 THEN 'String D'
END AS RandomString -- Returns String A, B, C, D and NULLs.
FROM sys.all_objects
outputtet RandomString 列包含一些 NULL,如 SQL fiddle 所示。我发现我可以将随机化表达式包装在 CTE 中以避免输出中出现 NULL,但我仍然想知道为什么上面的代码返回 NULL?
WITH RandomNumber AS (
SELECT ABS(CHECKSUM(NEWID())) % 4 AS N FROM sys.all_objects
)
SELECT TOP 100
CASE N
WHEN 0 THEN 'String A'
WHEN 1 THEN 'String B'
WHEN 2 THEN 'String C'
WHEN 3 THEN 'String D'
END AS RandomString -- Does not return any NULLs. Only String A, B, C and D.
FROM RandomNumber
我尝试使用稍微不同的方法生成随机数,但结果是一样的:
CAST(RAND(CHECKSUM(NEWID())) * 4 AS INT) -- Returns a value between 0 and 3
这似乎是SQL Server 2014上的问题,我没有在其他版本上测试过。
【问题讨论】:
-
为了获得更好质量的随机数,您可能需要考虑
CRYPT_GEN_RANDOM。
标签: sql-server tsql random case