我有一个表Users
,其中包含一个名为status
的整数列,我想从整数列表(10,20, 30)
中选择一个随机值,并为每一行设置为status
。
我正在使用它:
update "Users" set "status" = i.a from (select a from (SELECT 30 AS a
UNION ALL SELECT 10 AS a
UNION ALL SELECT 20 AS a) as s order by random() limit 1) i
结果:
id | status
1 20
2 20
3 20
-- other rows have the same status value (20)
答案 0 :(得分:1)
问题是from
子句只执行一次 - 因此你只得到一个值。
如果您没有列表,最简单的方法是:
update users
set status = cast(random() * 3 as int) * 10;
您可以尝试以下版本:
update Users
set status = (select a
from (values (30), (10), (20) ) v(a)
limit 1
);
但是,我认为Postgres会“优化”子查询并决定只执行一次。 (我认为这是一个错误,因为random()
是易变的,但这是另一回事。)
如果发生这种情况,将子查询与外部查询相关联通常可以解决问题:
update Users
set status = (select a
from (values (30), (10), (20) ) v(a)
where users.status <> v.a
order by random()
limit 1
);
答案 1 :(得分:-1)
您需要一些查询来在set
子句中选择一个随机值,如:
UPDATE Users
SET
Status = (
SELECT TOP 1 [value]
FROM (
SELECT * FROM string_split('10,20,30', ',')
ORDER BY NEWID()
)
)
您可以查看here以查看在不同DBS中使用随机值的不同方法。 (此示例适用于SQL Server)