Return 列表中的随机值
Return random value from the list
我正在使用 SQL Server 2014,并且想利用新功能 CHOOSE 和 RAND。基本上想return从列表中随机选择颜色。
类似于:
Select CHOOSE(RAND(29), 'bg-blue', 'bg-blue-madison', 'bg-blue-hoki', 'bg-blue-steel', 'bg-blue-chambray',
'bg-green-meadow', 'bg-green', 'bg-green-seagreen', 'bg-green-turquoise', 'bg-green-haze', 'bg-green-jungle',
'bg-red', 'bg-red-pink', 'bg-red-sunglo', 'bg-red-intense', 'bg-red-thunderbird', 'bg-red-flamingo',
'bg-yellow', 'bg-yellow-gold', 'bg-yellow-casablanca', 'bg-yellow-lemon',
'bg-purple', 'bg-purple-plum', 'bg-purple-studio', 'bg-purple-seance',
'bg-grey-cascade', 'bg-grey-silver', 'bg-grey-steel', 'bg-grey-gallery') AS Colour
可能吗?
你必须在下面使用 RAND
+ ROUND
来获得从 1 到 29 的整数:
DECLARE @num INT = ROUND(RAND()*28,0) + 1
SELECT CHOOSE(@num, 'bg-blue', 'bg-blue-madison', 'bg-blue-hoki', 'bg-blue-steel', 'bg-blue-chambray',
'bg-green-meadow', 'bg-green', 'bg-green-seagreen', 'bg-green-turquoise', 'bg-green-haze', 'bg-green-jungle',
'bg-red', 'bg-red-pink', 'bg-red-sunglo', 'bg-red-intense', 'bg-red-thunderbird', 'bg-red-flamingo',
'bg-yellow', 'bg-yellow-gold', 'bg-yellow-casablanca', 'bg-yellow-lemon',
'bg-purple', 'bg-purple-plum', 'bg-purple-studio', 'bg-purple-seance',
'bg-grey-cascade', 'bg-grey-silver', 'bg-grey-steel', 'bg-grey-gallery') AS Test
为了更准确,您可以使用 CEILING
,正如@GarethD 在下面评论的那样:
DECLARE @num INT = CEILING(RAND()*29)
试试这个
Declare @RandVal INT
SELECT @RandVal = ABS(Checksum(NewID()) % 29) + 1
SELECT @RandVal
Select CHOOSE(@RandVal, 'bg-blue', 'bg-blue-madison', 'bg-blue-hoki', 'bg-blue-steel', 'bg-blue-chambray',
'bg-green-meadow', 'bg-green', 'bg-green-seagreen', 'bg-green-turquoise', 'bg-green-haze', 'bg-green-jungle',
'bg-red', 'bg-red-pink', 'bg-red-sunglo', 'bg-red-intense', 'bg-red-thunderbird', 'bg-red-flamingo',
'bg-yellow', 'bg-yellow-gold', 'bg-yellow-casablanca', 'bg-yellow-lemon',
'bg-purple', 'bg-purple-plum', 'bg-purple-studio', 'bg-purple-seance',
'bg-grey-cascade', 'bg-grey-silver', 'bg-grey-steel', 'bg-grey-gallery') AS Colour
RAND 函数将种子值作为参数,而不是最大随机值。您需要将随机数的结果乘以您需要的最大值,以获得该范围内的随机数。
当我测试这个时,我必须先将随机值传递给一个变量,否则它有时只是返回 null。正如 Gareth D 在评论中提到的,这是因为每次检查一个选择是否相等时,函数评估 RAND() 的方式将被调用一次。
DECLARE @counter smallint;
SET @counter = (RAND()*28)+1;
Select @counter, CHOOSE(@counter, 'bg-blue', 'bg-blue-madison', 'bg-blue-hoki', 'bg-blue-steel', 'bg-blue-chambray',
'bg-green-meadow', 'bg-green', 'bg-green-seagreen', 'bg-green-turquoise', 'bg-green-haze', 'bg-green-jungle',
'bg-red', 'bg-red-pink', 'bg-red-sunglo', 'bg-red-intense', 'bg-red-thunderbird', 'bg-red-flamingo',
'bg-yellow', 'bg-yellow-gold', 'bg-yellow-casablanca', 'bg-yellow-lemon',
'bg-purple', 'bg-purple-plum', 'bg-purple-studio', 'bg-purple-seance',
'bg-grey-cascade', 'bg-grey-silver', 'bg-grey-steel', 'bg-grey-gallery') AS Colour
你没有提到你知道这一点,如果你不知道,我会再给你一个解决方案:
SELECT TOP 1 v FROM(VALUES('bg-blue'), ('bg-blue-madison'), ('bg-blue-hoki'))t(v)
ORDER BY NEWID()
我正在使用 SQL Server 2014,并且想利用新功能 CHOOSE 和 RAND。基本上想return从列表中随机选择颜色。
类似于:
Select CHOOSE(RAND(29), 'bg-blue', 'bg-blue-madison', 'bg-blue-hoki', 'bg-blue-steel', 'bg-blue-chambray',
'bg-green-meadow', 'bg-green', 'bg-green-seagreen', 'bg-green-turquoise', 'bg-green-haze', 'bg-green-jungle',
'bg-red', 'bg-red-pink', 'bg-red-sunglo', 'bg-red-intense', 'bg-red-thunderbird', 'bg-red-flamingo',
'bg-yellow', 'bg-yellow-gold', 'bg-yellow-casablanca', 'bg-yellow-lemon',
'bg-purple', 'bg-purple-plum', 'bg-purple-studio', 'bg-purple-seance',
'bg-grey-cascade', 'bg-grey-silver', 'bg-grey-steel', 'bg-grey-gallery') AS Colour
可能吗?
你必须在下面使用 RAND
+ ROUND
来获得从 1 到 29 的整数:
DECLARE @num INT = ROUND(RAND()*28,0) + 1
SELECT CHOOSE(@num, 'bg-blue', 'bg-blue-madison', 'bg-blue-hoki', 'bg-blue-steel', 'bg-blue-chambray',
'bg-green-meadow', 'bg-green', 'bg-green-seagreen', 'bg-green-turquoise', 'bg-green-haze', 'bg-green-jungle',
'bg-red', 'bg-red-pink', 'bg-red-sunglo', 'bg-red-intense', 'bg-red-thunderbird', 'bg-red-flamingo',
'bg-yellow', 'bg-yellow-gold', 'bg-yellow-casablanca', 'bg-yellow-lemon',
'bg-purple', 'bg-purple-plum', 'bg-purple-studio', 'bg-purple-seance',
'bg-grey-cascade', 'bg-grey-silver', 'bg-grey-steel', 'bg-grey-gallery') AS Test
为了更准确,您可以使用 CEILING
,正如@GarethD 在下面评论的那样:
DECLARE @num INT = CEILING(RAND()*29)
试试这个
Declare @RandVal INT
SELECT @RandVal = ABS(Checksum(NewID()) % 29) + 1
SELECT @RandVal
Select CHOOSE(@RandVal, 'bg-blue', 'bg-blue-madison', 'bg-blue-hoki', 'bg-blue-steel', 'bg-blue-chambray',
'bg-green-meadow', 'bg-green', 'bg-green-seagreen', 'bg-green-turquoise', 'bg-green-haze', 'bg-green-jungle',
'bg-red', 'bg-red-pink', 'bg-red-sunglo', 'bg-red-intense', 'bg-red-thunderbird', 'bg-red-flamingo',
'bg-yellow', 'bg-yellow-gold', 'bg-yellow-casablanca', 'bg-yellow-lemon',
'bg-purple', 'bg-purple-plum', 'bg-purple-studio', 'bg-purple-seance',
'bg-grey-cascade', 'bg-grey-silver', 'bg-grey-steel', 'bg-grey-gallery') AS Colour
RAND 函数将种子值作为参数,而不是最大随机值。您需要将随机数的结果乘以您需要的最大值,以获得该范围内的随机数。
当我测试这个时,我必须先将随机值传递给一个变量,否则它有时只是返回 null。正如 Gareth D 在评论中提到的,这是因为每次检查一个选择是否相等时,函数评估 RAND() 的方式将被调用一次。
DECLARE @counter smallint;
SET @counter = (RAND()*28)+1;
Select @counter, CHOOSE(@counter, 'bg-blue', 'bg-blue-madison', 'bg-blue-hoki', 'bg-blue-steel', 'bg-blue-chambray',
'bg-green-meadow', 'bg-green', 'bg-green-seagreen', 'bg-green-turquoise', 'bg-green-haze', 'bg-green-jungle',
'bg-red', 'bg-red-pink', 'bg-red-sunglo', 'bg-red-intense', 'bg-red-thunderbird', 'bg-red-flamingo',
'bg-yellow', 'bg-yellow-gold', 'bg-yellow-casablanca', 'bg-yellow-lemon',
'bg-purple', 'bg-purple-plum', 'bg-purple-studio', 'bg-purple-seance',
'bg-grey-cascade', 'bg-grey-silver', 'bg-grey-steel', 'bg-grey-gallery') AS Colour
你没有提到你知道这一点,如果你不知道,我会再给你一个解决方案:
SELECT TOP 1 v FROM(VALUES('bg-blue'), ('bg-blue-madison'), ('bg-blue-hoki'))t(v)
ORDER BY NEWID()