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

如何检测PostgreSQL的jsonb列中是否存在键值对重叠?

PostgreSQL JSONB 键值对重叠检查方案

问题回顾

你已经通过<@操作符实现了jsonb列内容是否为查询参数的子集的判断:

SELECT '{"k1": "v1"}'::jsonb <@ '{"k1": "v1", "k2":"v2"}'::jsonb;  -- 返回 true

现在需要实现两个jsonb是否存在键值对重叠的判断,之前尝试&&操作符报错,因为PostgreSQL未为jsonb定义该操作符。

解决方案

方法1:使用jsonb_intersection函数(PostgreSQL 12+)

PostgreSQL 12及以上版本提供了jsonb_intersection函数,可直接返回两个jsonb的键值对交集,再判断结果是否非空即可:

SELECT jsonb_intersection('{"k1": "v1", "k3":"v4"}'::jsonb, '{"k1": "v1", "k2":"v2"}'::jsonb) <> '{}'::jsonb;
-- 返回 true,因为交集是 {"k1": "v1"}

方法2:兼容低版本的自定义判断

如果你的PostgreSQL版本低于12,可以通过提取键值对后对比的方式实现:

SELECT EXISTS (
    SELECT 1
    FROM jsonb_each('{"k1": "v1", "k3":"v4"}'::jsonb) AS a(k, v)
    JOIN jsonb_each('{"k1": "v1", "k2":"v2"}'::jsonb) AS b(k, v)
    ON a.k = b.k AND a.v = b.v
);
-- 返回 true

该查询将两个jsonb展开为键值对行,匹配相同的键和值,只要存在匹配行就返回true。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 03:52:04