【问题标题】:sqlalchemy how to using AND in OR operation?sqlalchemy 如何在 OR 操作中使用 AND?
【发布时间】:2013-02-19 08:56:32
【问题描述】:

我需要做这个查询:

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

我该怎么办?

【问题讨论】:

    标签: python sql sqlalchemy mixed parentheses


    【解决方案1】:

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

    如果您尝试相反的方式(在您的代码中切换 or_and_),您会注意到 sqlalchemy 确实会生成括号。

    【讨论】:

    • 我认为“WHERE Con​​d1 AND Cond2 OR Cond3 AND Cond4”和“WHERE (Cond1 AND Cond2) OR (Cond3 AND Cond4)”应该不一样。
    • 对不起,你是对的,我在mysql数据库中测试过。结果是一样的。
    猜你喜欢
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    相关资源
    最近更新 更多