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

Bil*_*ill 14 sql sql-server sql-server-2012

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

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

我如何随机化这些值?

谢谢

Gio*_*uri 21

您可以使用以下技巧执行此操作:

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;
Run Code Online (Sandbox Code Playgroud)

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


Ben*_*hul 8

这是一些喜欢使用 choose

with cte as (
   select *, (ABS(CHECKSUM(NewId())) % 3) + 1 as n
   from contacts
   where city = 'NY'
)
update cte
set firstname = choose(n, 'Bill','Steve','Jack')
Run Code Online (Sandbox Code Playgroud)


BIC*_*ube 5

你可以做这样的事情

-- 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'
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢,继续获取所有行的最后一个值(例如 Jack)。有没有办法在同一运行中将其随机化为不同的行? (2认同)