我有两张桌子:
表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 ??
答案 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);