将PGSQL中的多行更新为相同的值

时间:2015-02-25 15:52:41

标签: postgresql psql

如果之前有人问过我,我很抱歉,但是我用谷歌搜索,无法找到一个好的搜索结果。

我有一个看起来像这样的表:

col_a, col_b
    a,     1,
    a,     2,
    a,     3,
    b,     1,
    b,     2,
    c,     1,

我需要使用生成随机代码值的函数更新col_a中的值,但是'a'的所有值都需要更新为相同的值,对于'b'则相同。是否有系统的方法可以做这个,除了:

UPDATE tbl SET col_a = make_code() WHERE col_a = 'a';
UPDATE tbl SET col_a = make_code() WHERE col_a = 'b'; ...

1 个答案:

答案 0 :(得分:1)

如果make_code()真正像random()一样工作,则多个update语句不保证每个update语句使用相同的代码。

您需要在实际更新发生之前计算代码(对于每个distinct原始代码)。您可以使用子查询执行此操作,或者(更具可读性)CTE

with codes as (
  select distinct on (col_a)
         col_a original_code,
         make_code() generated_code
  from   tbl
)
update tbl
set    col_a = generated_code
from   codes
where  col_a = original_code;

SQLFiddle