postgresql 在具有给定变量对的循环中执行更新语句

8cdiaqws  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(176)

我想根据另一个字段中的条件更新数据库中的列。我可以通过两个独立的查询来做到这一点:

update table_a
    set field_1 = 'English text'
        where ctid in (
            select table_a.ctid from table_a
                left join table_b
                    on table_b.a_id  = table_b.id
                left join table_c
                    on table_c.id = table_b.c_id
            where table_c.language = 'EN'
        );

update table_a
    set field_1 = 'French text'
        where ctid in (
            select table_a.ctid from table_a
                left join table_b
                    on table_b.a_id  = table_b.id
                left join table_c
                    on table_c.id = table_b.c_id
            where table_c.language = 'FR'
        );

但是,还有更多的语言需要考虑。我想写一个脚本,我可以定义一个Map的语言/文本对,然后执行上述语句的每一对。我该怎么做呢?
我试着寻找PL/pgSQL For循环,但我无法应用我能找到的例子。

7gs2gvoe

7gs2gvoe1#

一种选择是将语言代码/描述的对声明为行,然后过滤和更新。
我还怀疑你的in条件可以重写为exists,而不需要使用ctid并重新打开源表。所以:

update table_a as a
set field_1 = v.txt
from ( values 
    ('EN', 'English text'), 
    ('FR', 'French text') 
) as v(code, txt)
where exists ( 
    select 1 
    from table_b as b 
    inner join table_c as c on c.id = b.c_id 
    where c.language = v.code and b.a_id = a.id
)

相关问题