如何对select方法中定义的别名使用where方法进行筛选
解决方案
核心原因
SQL 执行顺序中 WHERE 逻辑优先级高于 SELECT 别名定义,且聚合函数(如sum)的计算结果无法在WHERE阶段获取,因此直接在where方法中传入别名条件无法被识别。
另外你收到的返回值<#Object::ActiveRecord_AssociationRelation:0x3fe455b3ad5c>是ActiveRecord的懒加载Relation对象,并非报错,调用to_a、first等方法才会真正触发SQL执行。
正确实现方式
方式1:使用having方法适配聚合筛选
针对你使用sum聚合的场景,聚合结果的筛选需要用having替代where,有两种写法:
- 兼容所有数据库的稳妥写法(直接复用聚合表达式)
object.select("COALESCE(sum(stock.quantity), 0) as cnt") .having("COALESCE(sum(stock.quantity), 0) = ?", 0)
- 兼容MySQL等支持别名在
having中使用的数据库写法
object.select("COALESCE(sum(stock.quantity), 0) as cnt") .having("cnt = ?", 0)
方式2:子查询包裹实现别名where筛选
如果是非聚合字段的别名筛选,可将原查询作为子查询外层套一层查询,即可在where中直接使用别名:
# 构造子查询 sub_query = object.select("COALESCE(sum(stock.quantity), 0) as cnt").arel # 外层查询使用别名筛选 object.from(sub_query, :objects).where(cnt: 0)
内容的提问来源于stack exchange,提问作者patrick_star
相关产品推荐
相关产品推荐

