SQL Server 2012列表中的随机字符串

时间:2015-05-12 19:45:17

标签: sql sql-server sql-server-2012

说我有3个价值观,比尔,史蒂夫,杰克。我想用这些值随机更新一个表,例如

更新联系人设置firstname =('比尔','史蒂夫','杰克')其中city ='NY'

如何随机化这些值?

由于

5 个答案:

答案 0 :(得分:20)

您可以使用以下技巧完成此操作:

update c set name=ca.name
from contacts c
outer apply(select top 1 name 
            from (values('bill'),('steve'),('jack')) n(name)
            where c.id = c.id order by newid())ca;

c.id = c.id只是一个虚拟谓词,它强制sql引擎为每个外行调用子查询。这是小提琴http://sqlfiddle.com/#!6/8ecca/22

答案 1 :(得分:7)

Here's some love using random_state

choose

答案 2 :(得分:3)

你可以做这样的事情

-- Storing the list of strings in a CTE

WITH PossibleValues AS 
( SELECT 'Bill' AS Name, 
          1 AS Number
  UNION SELECT 'Steve' AS NAME, 
         2 AS Number
  UNION SELECT 'Jack' AS NAME,
         3 AS Number
 )

UPDATE contacts
SET firstname = (SELECT Name
                          FROM PossibleValues
                          WHERE PossibleValues.Number = FLOOR(RAND()*(4-1)+1))
WHERE City = 'NY'

每次运行查询时,FLOOR(RAND()*(4-1)+1)都会生成1到3的随机数。因此,您每次都会选择一个随机名称。

答案 3 :(得分:0)

这可能会回答你的问题:

How do I generate random number for each row in a TSQL Select?

使用RAND生成一个数字,确定要使用的数字。

答案 4 :(得分:0)

这是使用Ben Thul答案的加法答案:

DECLARE @index INT
SELECT  @index = CAST(RAND() * 3 + 1 AS INT)
UPDATE contacts SET firstname = CHOOSE(@index,'Bill','Steve','Jack') WHERE city = 'NY'

使用RAND函数将从1到3的随机值。然后,基于结果int值,CHOOSE函数将根据给定字符串的顺序/索引选择值。在其中,“比尔”是索引1,依此类推。

您可以使用以下SQL脚本测试随机int值:

SELECT CAST(RAND() * 3 + 1 AS INT)

如果直接在以下查询中使用RAND,我会遇到一个奇怪的问题:

SELECT CHOOSE( CAST(RAND() * 3 + 1 AS INT),'Bill','Steve','Jack')

有些实例的值为NULL。