说我有3个价值观,比尔,史蒂夫,杰克。我想用这些值随机更新一个表,例如
更新联系人设置firstname =('比尔','史蒂夫','杰克')其中city ='NY'
如何随机化这些值?
由于
答案 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)
答案 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。