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

求助:PostgreSQL中jsonb数组所有元素严格匹配状态的查询方法

PostgreSQL筛选JSONB数组所有元素满足条件的记录

针对你的需求——筛选master_data_approval_table表中approval_value(JSONB数组)内每个对象的status字段都严格等于"Approved"的记录,以下是几种可行的查询语句:

方法1:兼容性最优(适合所有支持JSONB的PostgreSQL版本)

通过子查询检查数组中是否不存在status不等于"Approved"的元素:

SELECT *
FROM master_data_approval_table
WHERE NOT EXISTS (
    SELECT 1
    FROM jsonb_array_elements(approval_value) AS elem
    WHERE elem->>'status' != 'Approved'
);

方法2:通过计数匹配判断(逻辑直观)

统计数组中status为"Approved"的元素数量,与数组总长度对比,若相等则说明所有元素都符合条件:

SELECT *
FROM master_data_approval_table
WHERE (
    SELECT COUNT(*)
    FROM jsonb_array_elements(approval_value) AS elem
    WHERE elem->>'status' = 'Approved'
) = jsonb_array_length(approval_value);

方法3:简洁的JSONPath方式(PostgreSQL 12+版本适用)

利用PostgreSQL 12引入的JSONPath语法,直接判断数组中所有元素的status都等于"Approved":

SELECT *
FROM master_data_approval_table
WHERE jsonb_path_exists(approval_value, '$.every(@.status == "Approved")'::jsonpath);

注意事项

  • 如果approval_value可能为空数组,上述方法都会返回空数组的记录(因为空数组没有不满足条件的元素),若需要排除空数组,可在WHERE条件中添加jsonb_array_length(approval_value) > 0。
  • 使用->>运算符可以将JSONB字段转为文本类型,确保与"Approved"的字符串对比是严格匹配的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 09:42:51