首页 > 解决方案 > Postgres 在哪里被忽略?

问题描述

我试图在 Postgres 中链接多个 WHERE AND 语句,但似乎它们被忽略了。

我的查询是

SELECT id, title, tags, selected_preview_image, items, uid
            FROM  fb_designs r, json_array_elements(r.items#>'{listings}') obj
            WHERE  obj->>'active' = 'false' OR obj->>'active' = 'true'
            AND title LIKE '%hoot%'
            AND tags @> '{"123"}'
            GROUP BY id

但是,正如您在下面的输出中看到的那样,它忽略了标题和标签查询

在此处输入图像描述

任何人都可以帮忙吗?

标签: postgresql

解决方案


用括号括住ORed 条件

WHERE  
    (obj->>'active' = 'false' OR obj->>'active' = 'true')
    AND title LIKE '%hoot%'
    AND tags @> '{"123"}'

或者更好的是,使用IN

WHERE  
    obj->>'active' IN ('false', 'true')
    AND title LIKE '%hoot%'
    AND tags @> '{"123"}'

理由:OR优先级低于AND

所以这:

obj->>'active' = 'false' 
OR obj->>'active' = 'true'
AND title LIKE '%hoot%'
AND tags @> '{"123"}'

实际上相当于:

obj->>'active' = 'false' 
OR (
    obj->>'active' = 'true'
    AND title LIKE '%hoot%'
    AND tags @> '{"123"}'
)

如您所见,使用上面的表达式,任何有的记录obj->>'active' = 'false'都会通过。


推荐阅读