You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让SQLAlchemy为MS SQL Server生成带双层括号的OR非空过滤条件

编辑:我在本次筛选后的查询逻辑中存在一处错误。不过因为这个问题的答案本身很有参考价值,因此保留原提问内容。

问题原因

SQLAlchemy生成SQL时会默认简化冗余括号,仅在运算符优先级需要时才保留括号。你需要额外外层括号的场景,通常是该OR条件需要和其他AND条件联合使用,避免因为SQL中AND优先级高于OR导致逻辑出错。

解决方案

可以通过两种方式强制为整个OR表达式包裹外层括号:

  1. 使用grouped函数包裹整个条件表达式
from sqlalchemy import or_, grouped

# 运算符写法
filter(grouped(TAB1.c.this.isnot(None) | TAB2.c.that.isnot(None)))
# or_ 函数写法
filter(grouped(or_(TAB1.c.PERSONNE_ID.isnot(None), TAB2.c.PERSONNE_ID.isnot(None))))
  1. 直接调用表达式的self_group()方法
filter(or_(TAB1.c.PERSONNE_ID.isnot(None), TAB2.c.PERSONNE_ID.isnot(None)).self_group())

以上两种写法生成的SQL都会符合你要求的WHERE ((this IS NOT NULL OR that IS NOT NULL))格式。

补充说明

如果该OR条件是WHERE子句中的唯一条件,单层括号和双层括号在T-SQL中的执行逻辑完全等价,不会出现结果差异。仅当该条件和其他AND条件并列时,才需要额外外层括号保证逻辑优先级正确。

内容的提问来源于stack exchange,提问作者Vincenzo Lavorini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 00:45:01