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

PostgreSQL如何检查JSONB指定路径下的数组是否包含值'v3'

PostgreSQL JSONB 查找包含指定元素的数组键值对

场景说明

有一张表包含以下字段:

  • c1:字符串类型
  • c2:整数类型
  • jsonb:JSONB类型,结构示例如下:
{
  "o1": "hi",
  "o2": "hello",
  "o3": {
    "o3a": {
      "o3aa": {
        "id1": ["v1", "v2", "v3"],
        "id2": ["v3"],
        "id99": ["v99", "v2", "v3"]
      }
    },
    "o3ab": true
  }
}

需求是:找出jsonb字段中o3->o3a->o3aa下所有值为数组且包含'v3'的键(如id1、id2、id99),或筛选表中存在这类键的行。

错误分析

你尝试的第二条SQL返回空结果,原因是$.o3.o3a.o3aa是JSON对象而非数组,$[*]是数组遍历语法,无法遍历对象的属性,因此匹配不到任何内容。

解决方案

1. 筛选表中符合条件的行

如果只需找出表中存在至少一个o3aa下的数组包含'v3'的行,使用JSON路径表达式:

SELECT * 
FROM your_table 
WHERE jsonb @? '$.o3.o3a.o3aa.* ? (@ contains "v3")';
  • $.o3.o3a.o3aa.*:遍历o3aa下的所有属性值
  • @ contains "v3":判断当前属性值(数组)是否包含"v3"元素

2. 提取具体包含'v3'的键名

如果需要获取所有符合条件的键名(如id1、id2),可以用jsonb_each展开对象的键值对后筛选:

SELECT t.c1, t.c2, j.key AS id_name
FROM your_table t
JOIN jsonb_each(t.jsonb -> 'o3' -> 'o3a' -> 'o3aa') j ON true
WHERE j.value @> '"v3"'::jsonb;
  • jsonb_each(...):将o3aa对象拆分成多行,每行包含key(键名)和value(对应数组)
  • j.value @> '"v3"'::jsonb:判断数组是否包含'v3'(需将字符串转为JSONB类型)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:05:35