将 PGSQL 中的多行更新为相同的值
Updating multiple rows in PGSQL to the same value
如果之前有人问过这个问题,我深表歉意,但我在谷歌上搜索了一下,无法找到合适的搜索结果。
我有一个 table 看起来像这样:
col_a, col_b
a, 1,
a, 2,
a, 3,
b, 1,
b, 2,
c, 1,
我需要使用生成随机代码值的函数更新 col_a 中的值,但是 'a' 的所有值都需要更新为相同的值,[=19= 也是如此] 等。有没有系统的方法可以做到这一点,除了:
UPDATE tbl SET col_a = make_code() WHERE col_a = 'a';
UPDATE tbl SET col_a = make_code() WHERE col_a = 'b'; ...
如果 make_code()
确实像 random()
一样工作,多个 update
语句不能保证每个 update
语句的代码相同。
您需要在真正更新发生之前计算一个代码(对于每个 distinct
个原始代码)。您可以使用子查询或(更具可读性)a 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;
如果之前有人问过这个问题,我深表歉意,但我在谷歌上搜索了一下,无法找到合适的搜索结果。
我有一个 table 看起来像这样:
col_a, col_b
a, 1,
a, 2,
a, 3,
b, 1,
b, 2,
c, 1,
我需要使用生成随机代码值的函数更新 col_a 中的值,但是 'a' 的所有值都需要更新为相同的值,[=19= 也是如此] 等。有没有系统的方法可以做到这一点,除了:
UPDATE tbl SET col_a = make_code() WHERE col_a = 'a';
UPDATE tbl SET col_a = make_code() WHERE col_a = 'b'; ...
如果 make_code()
确实像 random()
一样工作,多个 update
语句不能保证每个 update
语句的代码相同。
您需要在真正更新发生之前计算一个代码(对于每个 distinct
个原始代码)。您可以使用子查询或(更具可读性)a 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;