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

如何在PostgreSQL中按布尔值过滤JSON数据

在PostgreSQL中过滤JSON数组里f2和f3均为true的数据

假设你有一张表(例:test_table),其中存储JSON数据的字段为data(推荐用jsonb类型,比json性能更优),字段结构如下:

{
"L1": [
{
"f1": "446",
"f2": true,
"f3": true
},
{
"f1": "191",
"f2": true,
"f3": true
}
]
}

以下是两种可行的过滤方案:

方案1:展开JSON数组后过滤

适用于所有支持JSON的PostgreSQL版本,通过展开数组为单行记录再筛选:

SELECT 
  elem->>'f1' AS f1,
  elem->>'f2' AS f2,
  elem->>'f3' AS f3
FROM test_table,
     jsonb_array_elements(data->'L1') AS elem
WHERE 
  (elem->>'f2')::boolean = true
  AND (elem->>'f3')::boolean = true;
  • jsonb_array_elements(data->'L1') 将L1数组拆分为多条行记录,每条对应一个数组对象(别名elem)
  • elem->>'f2' 提取字段文本值,通过::boolean转换为布尔类型后判断是否为true

如果字段是json类型,将jsonb_array_elements替换为json_array_elements即可。

方案2:JSON路径查询(PostgreSQL 12+)

利用PostgreSQL 12及以上版本支持的JSON路径语法,直接在JSON结构内筛选:

SELECT 
  jsonb_path_query(data, '$.L1[*] ? (@.f2 == true && @.f3 == true)') AS filtered_item
FROM test_table;
  • $.L1[*] 遍历L1数组的所有元素
  • ? (@.f2 == true && @.f3 == true) 仅保留f2和f3均为true的元素

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 03:25:29