You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL中移除JSONB数组重复元素的方法求助

PostgreSQL jsonb 数组去重实现方法

基础查询去重(不保留原始顺序)

如果只需要去除数组重复元素,不关心元素顺序,可以用以下SQL:
假设你的表名为your_table,目标列是web(jsonb类型):

SELECT 
    id, -- 替换为你的表主键/唯一标识列,确保对应原数据行
    jsonb_agg(DISTINCT elem) AS unique_web
FROM 
    your_table,
    jsonb_array_elements(web) AS elem
GROUP BY 
    id;

直接更新表数据

如果要直接修改表中web列的值,替换为去重后的数组:

UPDATE your_table
SET web = (
    SELECT jsonb_agg(DISTINCT elem)
    FROM jsonb_array_elements(web) AS elem
);

保留元素原始出现顺序

如果需要保留元素在原数组中第一次出现的顺序,可以结合WITH ORDINALITY获取元素位置,用窗口函数筛选首次出现的元素:

SELECT 
    id,
    jsonb_agg(elem ORDER BY idx) AS unique_web
FROM (
    SELECT 
        id,
        elem,
        idx,
        -- 给每个分组下的元素按出现位置标记行号
        ROW_NUMBER() OVER (PARTITION BY id, elem ORDER BY idx) AS rn
    FROM 
        your_table,
        -- WITH ORDINALITY 获取元素在数组中的原始位置(PostgreSQL 9.4+支持)
        jsonb_array_elements(web) WITH ORDINALITY AS arr(elem, idx)
) AS sub_query
WHERE rn = 1 -- 只保留每个元素第一次出现的行
GROUP BY id;

关键函数说明

  • jsonb_array_elements:将jsonb数组拆分为单行元素;
  • DISTINCT:过滤重复元素;
  • jsonb_agg:将单行元素重新聚合为jsonb数组;
  • WITH ORDINALITY:用于获取元素在原数组中的索引位置,实现顺序保留。

内容的提问来源于stack exchange,提问作者hero_star

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 09:10:44