SQLAlchemy如何在OR操作中使用AND?

10

我需要执行这个查询:

SELECT *
FROM tbl_member
WHERE (member_type==1 AND member_status==1)
   OR (member_type==2 and member_status==2)

我尝试过以下方法:

q=session.query(tbl_member) \
  .filter(or_(and_(tbl_member.member_type==1,tbl_member.member_status==1), \
              and_(tbl_member.member_type==2,tbl_member.member_status==2)))

并且

q=session.query(tbl_member) \ 
  .filter(or_((and_(tbl_member.member_type==1,tbl_member.member_status==1)), \
              (and_(tbl_member.member_type==2,tbl_member.member_status==2))))

查询 SQL 仍然保持不变,如下所示:
SELECT *
FROM tbl_member
WHERE member_type==1 AND member_status==1 OR member_type==2 AND member_status==2

我该怎么做?


相关主题,其中 答案 提供了关于 AND 优先于 OR 的参考文献列表。 - metatoaster
1个回答

10
查询在语义上是相同的,因为 AND 的优先级高于 OR,因此
WHERE Cond1 AND Cond2 OR Cond3 AND Cond4 将产生与 WHERE (Cond1 AND Cond2) OR (Cond3 AND Cond4) 相同的结果。

如果您尝试反过来(在代码中切换 or_and_),您会注意到 sqlalchemy 会生成括号。


1
我认为 "WHERE Cond1 AND Cond2 OR Cond3 AND Cond4" 和 "WHERE (Cond1 AND Cond2) OR (Cond3 AND Cond4)" 不应该是相同的。 - nick.xu
对不起,你是对的,我在MySQL数据库中测试过了,结果是一样的。 - nick.xu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接