Postgresql如果字符串中有单词,如何更新列?

时间:2017-03-09 11:50:48

标签: sql postgresql

我有两张桌子:

表A有一个邮编列,每行有一个邮政编码(例如行:E1 8NF)

表B,其中包含一个邮政编码列,其中多个邮政编码以逗号分隔(示例行:E1 8NF,E1 8NG,E1 8NJ)

如果表A中的邮政编码存在于表B中,我想给它一个1

如何在postgresql中执行此操作?我的询问到目前为止

UPDATE tablea
set pcd = 1 where tablea.postcode exists in tableb.postcode ??

3 个答案:

答案 0 :(得分:2)

在逗号分隔字段中存储列表是一个非常糟糕的主意。在像Postgres这样的数据库中更糟糕的是它具有非常合理的替代方案 - 例如数组和JSON字段。但是,有时候我们会被其他人困在决定。

一种方法是:

update tablea a
    set pcd = 1
    where exists (select 1
                  from tableb b
                  where ',' || a.postcode || ',' like ',' || replace(b.postcodes, ', ', ',') || ','
                 );

答案 1 :(得分:2)

您可以将逗号分隔列表转换为数组,然后在子选择中使用它:

update tablea a
    set pcd = 1
where exists (select *
              from tableb b
              where a.postcode = any(string_to_array(b.postcodes, ','))
              );

如果值在逗号之间用空格存储,则需要应用trim(),在更新中加入可能更容易:

update tablea a
    set pcd = 1
from (
   select trim(x.pc) as pc
   from tableb b, 
        unnest(string_to_array(b.postcodes)) as x(px)
) t
where a.postcode = t.pc;

答案 2 :(得分:0)

尝试这种方式:

UPDATE tablea set pcd = 1 where postcode in (select b.postcode from tableb);