Sql 使用从列表中随机选择的值更新每一行

Sql 使用从列表中随机选择的值更新每一行,sql,postgresql,Sql,Postgresql,我有一个名为status的整数列的表Users,我想从整数列表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

我有一个名为status的整数列的表Users,我想从整数列表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)
问题是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将优化子查询,并决定只执行一次。我认为这是一个bug,因为随机是不稳定的,但这是另一回事。 如果发生这种情况,将子查询与外部查询关联通常可以解决问题:

update Users
    set status = (select a
                  from (values (30), (10), (20) ) v(a)
                  where users.status <> v.a
                  order by random()
                  limit 1
                 );

您需要一些查询来选择set子句中的随机值,如:

UPDATE Users
SET
Status = (
    SELECT TOP 1 [value]
    FROM (
        SELECT * FROM string_split('10,20,30', ',')
        ORDER BY NEWID()
    )
)
您可以看到在不同的数据库中使用随机值的不同方法。此示例适用于SQL server