如何在Postgres JSON查询的WHERE子句中正确使用逻辑运算符
问题原因
你的查询逻辑运算符本身没有问题,错误出在JSON字段属性的取值写法:
你写的'paying' = 'true'是将两个字符串常量直接做等值判断,字符串'paying'永远不可能等于'true',所以这个判断条件的结果永远为false。
- 第一个OR查询中,右侧条件恒为假,所以最终只返回满足左侧
info ->> 'name' = 'Faber'的id=3的记录,和你看到的结果一致 - 第二个AND查询中,右侧条件恒为假,所以整个WHERE条件永远不成立,返回空结果
正确写法
所有从JSON类型字段中提取属性的操作,都需要显式指定字段和取值运算符,不能直接写属性名作为判断变量。你需要的两个查询正确写法如下:
查询「名字为Faber 或 付费状态为true」的记录
select * from sales where info ->> 'name' = 'Faber' OR info ->> 'paying' = 'true';
执行后会返回id=1(Alice,付费状态为true)、id=3(Faber)两条记录。
查询「名字为Alice 且 付费状态为true」的记录
select * from sales where info ->> 'name' = 'Alice' AND info ->> 'paying' = 'true';
执行后会返回id=1的符合条件的记录。
扩展说明
如果paying属性在JSON中存储的是布尔类型,也可以用类型转换的写法做判断,语义更清晰,也避免字符串匹配可能出现的大小写问题:
select * from sales where info ->> 'name' = 'Alice' AND (info -> 'paying')::boolean = true;
内容的提问来源于stack exchange,提问作者Enthusiast Coder
相关产品推荐
相关产品推荐

