【发布时间】:2015-07-23 20:55:43
【问题描述】:
假设我有 3 个值,Bill、Steve、Jack。我想用这些值随机更新一个表,例如
更新联系人集 firstname = ('Bill','Steve','Jack') where city = 'NY'
如何随机化这些值?
谢谢
【问题讨论】:
标签: sql sql-server sql-server-2012
假设我有 3 个值,Bill、Steve、Jack。我想用这些值随机更新一个表,例如
更新联系人集 firstname = ('Bill','Steve','Jack') where city = 'NY'
如何随机化这些值?
谢谢
【问题讨论】:
标签: sql sql-server sql-server-2012
您可以通过以下技巧做到这一点:
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
【讨论】:
这里有一些使用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')
【讨论】:
你可以这样做
-- 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 的随机数。因此,您每次都会选择一个随机名称。
【讨论】:
这是使用 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 函数将根据给定字符串的顺序/索引选择值。其中 'Bill' 是索引 1,依此类推。
您可以使用以下 SQL 脚本测试随机 int 值:
SELECT CAST(RAND() * 3 + 1 AS INT)
如果直接在查询中使用 RAND,我会遇到一个奇怪的问题,例如:
SELECT CHOOSE( CAST(RAND() * 3 + 1 AS INT),'Bill','Steve','Jack')
存在值为NULL的实例。
【讨论】:
{}按钮来更好地格式化它。
【讨论】:
尝试了上述所有建议,最终索引到 ID 以在 CHOOSE 函数上生成随机索引
select lastname, ,choose( ((ID % 3)+1),'Bill','John','Mac') as firstname from contacts
其中“3”是列表中的项目数。 它不是真正随机的,因为它被索引到您的行 id,但它足够随机,所以每一行都是不同的。
【讨论】: