postgresql varchar数组中的部分替换

iecba09b  于 2024-01-07  发布在  PostgreSQL
关注(0)|答案(1)|浏览(113)

数据库中有两个表,第一个表是Book,列是Id(varchar(40)), "Name"(varchar(255)), Tags(varchar(40)[]),第二个表是Temp,列是"Name"(varchar(255)), Id(varchar(40)), duplicateids (varchar(40)[])
我需要在postgresql中编写脚本。如果Book表中Tags列中的任何记录的id与Temp表中duplicateids列中的元素匹配,则仅将Book表中Tags列中数组中的此元素替换为Temp表中的Id字段。
示例表“Book”
| ID|名称|标签|
| --|--|--|
| 第一个|'Book1'|'tag1','tag2','tag3']|
| 2'|'Book2'|'tag4','tag5']|
表“温度”
| 名称|ID|重复类|
| --|--|--|
| 'Temp1'|测试标签|'tag2','tag5']|
| 'Temp2'|'tag100'|'tag3']|
脚本之后应该是:
| ID|名称|标签|
| --|--|--|
| 第一个|'Book1'|'tag1','testtag','tag100']|
| ‘2’|'Book2'|'tag4','testtag5']|

kyxcudwk

kyxcudwk1#

下面的查询通过将Book.Tags和Temp.duplicateids之间的第一个交集替换为Temp.Id来更新连接。如果每对存在max 1个交集,这应该有效,因为如果交集是空集,它将只计算为null,并且不替换任何东西。但是,如果可能有多个整数,那么这将只替换第一个匹配项。如果你想替换所有的匹配项,那么我建议实现一个有while循环的函数,虽然至少有一个交集会进行替换,直到交集为空集。但为了简洁起见,我没有在这里这样做。下面的查询未经测试,如果有任何问题请告诉我。

update Book
set Book.Tags = ARRAY_REPLACE(Book.Tags, (SELECT UNNEST(Book.Tags) INTERSECT SELECT UNNEST(Temp.duplicateids))[0], Temp.Id)
from Temp;

字符串
资料来源:

相关问题