SQL Server生成随机整数1、2、3的查询语句运行原理咨询
这段SQL查询的运行逻辑拆解
你使用的原查询代码如下:
SELECT FLOOR(3 * RAND(CONVERT(varbinary, NEWID())))
执行逻辑(从内层到外层逐层运算)
- 第一步:生成唯一随机值,调用
NEWID()函数,每次执行都会生成一个唯一的UNIQUEIDENTIFIER类型值(即GUID,格式类似A6F4489A-264E-4E87-B19A-9D7C3E2A81B3),确保每一次运算的随机种子都不重复,避免同查询中多次调用返回相同随机结果。 - 第二步:转换为种子兼容格式,通过
CONVERT(varbinary, NEWID())把生成的GUID转换为二进制类型,符合RAND()函数对种子参数的类型要求。 - 第三步:生成基础随机浮点数,调用
RAND(二进制种子),传入上一步得到的二进制值作为随机种子,返回一个区间为大于等于0、小于1的浮点型随机数。 - 第四步:放大随机数区间,把上一步得到的[0,1)区间浮点数乘以3,得到的结果范围变为大于等于0、小于3的浮点数,例如0.12、1.89、2.97都属于这个区间。
- 第五步:向下取整得到整数结果,调用
FLOOR()函数对[0,3)区间的浮点数做向下取整运算,最终得到的结果只能是0、1、2三个整数。
补充说明
如果你需要生成1、2、3的整数结果,当前查询的返回值是0、1、2,调整为如下写法即可满足需求:
SELECT FLOOR(3 * RAND(CONVERT(varbinary, NEWID()))) + 1
加1后结果范围就会偏移到1、2、3的区间。
内容的提问来源于stack exchange,提问作者suhas_patil
相关产品推荐
相关产品推荐

