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

时间:2018-01-14 14:14:54

标签: sql postgresql

我有一个表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)

2 个答案:

答案 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)