假设有一张桌子employee

create table employee (
    emp_id varchar(100),
    tags jsonb NOT NULL DEFAULT '[]' :: jsonb;
);

其中一行在tags列中包含以下信息

["TagA", "TagB", "TagC"]

目前,为了用其他值更新该列,我执行了以下查询

UPDATE employees SET tags = employees.tags || to_jsonb('["TagD", "TagA"]'::jsonb) where emp_id = 'EMP-111'

但是,这会将重复项添加到单元格,并使其看起来像

["TagA", "TagB", "TagC", "TagD", "TagA"]

这对我的用例来说不太可取.目前,为了绕过这一问题,我在应用程序层的后处理中处理了重复项.

有没有一种有效的方法可以在运行时删除像"Taga"这样的重复项?

推荐答案

您可以在子查询中使用jsonb_aggdistinct:

update employees set tags = (select jsonb_agg(distinct v.value #>> '{}') 
    from jsonb_array_elements(employees.tags || to_jsonb('["TagD", "TagA"]'::jsonb)) v) 
where emp_id = 'EMP-111'

See fiddle.

Sql相关问答推荐

使用group by后我的平均输出不是我想要的

基于模式或其他行集的数据复制

如何使用PostGIS从单个表中 Select 所有相交面组

Select 最大值,但当并列时,从其他列 Select 最大值

SQL查询组类值在同一行中,并连接和排序其他值

从自定义日期和时间开始,每月具有给定状态的公司数量

Oracle SQL根据列中的条件 Select 最大记录数

在Oracle SQL中将列值转换为行

导出部分条形码字符串GS1-128

SQL:如何在表中同时使用GROUPING和CONDITION?

Select 非重复值并按条件排除行

如果多行科目有一行在指定的日期范围内,如何 Select 该科目在该日期之前的所有行?

如何为该查询编写正确分区依据

我如何才能在付款人单列中拉出只有9个付款人单的人?

GRAFANA 数据库查询错误:pq:列名称不存在

在 postgres 中插入或更新 jsonb 数组的对象

在 R 值的 SQL 块中显示值

如何使用SQL将患者平均分配给他们所在地区的doctor

如何 Select 一列具有最小值而另一列具有给定值的记录?

如何跨行合并以删除 SQL 中的空值?