如何查询JSONB字段值全为'0'的PostgreSQL记录(无内连接)
解决PostgreSQL JSONB字段全值为'0'的查询问题
首先你之前用的jsonb_exists完全用错了——这个函数的作用是检查JSONB中是否存在指定键名,第二个参数只能是单个键名,不能写条件表达式,所以你的语句自然无效。
针对你的需求(JSONB字段所有值都是字符串'0',键名/数量不固定),不用子查询的方案如下:
用JSON路径函数(PostgreSQL 12+)
PostgreSQL 12及以上支持JSON路径查询,直接用jsonb_path_exists就能实现,不需要子查询:
SELECT * FROM mytable WHERE NOT jsonb_path_exists(myfield, '$.* ? (@ != "0")');
- 路径表达式
$.*匹配JSONB的所有顶层值 ? (@ != "0")筛选出值不等于字符串'0'的元素NOT取反后,就得到所有值都是'0'的记录
低版本替代方案(如果用不了JSON路径)
如果你的PostgreSQL版本低于12,没法用上面的方法,那还是得用子查询或者横向连接,但可以换个更紧凑的写法:
SELECT m.* FROM mytable m WHERE (SELECT bool_and(value = '0') FROM jsonb_each_text(m.myfield)) = true;
这里用bool_and聚合函数判断所有值是否都等于'0',结果为true的记录就是符合条件的。
内容的提问来源于stack exchange,提问作者Bheid
相关产品推荐
相关产品推荐

