【问题标题】:How to use where method on an alias defined on a select method如何在 select 方法上定义的别名上使用 where 方法
【发布时间】:2021-11-03 12:01:40
【问题描述】:

每个人。所以我无法进行此查询。

我有这个代码:

obj = object.select("COALESCE(sum(stock.quantity), 0) as cnt")

然后它返回

obj.first.cnt
# 0

我想用

过滤计数
object.select("COALESCE(sum(stock.quantity), 0) as cnt").where(cnt: 0)

我无法让它工作。它返回一个

<#Object::ActiveRecord_AssociationRelation:0x3fe455b3ad5c>

【问题讨论】:

  • count 是 SQL 中的内置函数。使用其他名称,例如 as stock_quantity
  • @max 编辑了代码。我的问题仍然存在。别名在 where 子句中似乎不起作用。
  • 你说它不起作用,你能分享它是如何失败的吗?它会抛出错误吗?它会返回错误的数据吗?预期的输出是多少?当前输出是多少?
  • @thesecretmaster 是的,所以当我执行 object.select("COALESCE(sum(stock.quantity), 0) as cnt").first.cnt 时它返回 0 但是当我添加 object.select("COALESCE(sum(stock.quantity), 0) as cnt").where(cnt: 0) 时它不会返回计数等于 0 的对象。

标签: ruby-on-rails ruby activerecord


【解决方案1】:

这里的问题是.where(cnt: 0) 会假设 cnt 是表中的一列:

WHERE "objects"."cnt" = ?

AR 实际上并不知道 cnt 是一个别名。

您可以改为使用字符串文字来引用别名:

object.select("COALESCE(sum(stock.quantity), 0) as cnt")
      .where(Arel.sql("cnt = ?"), 0)

【讨论】:

  • 你不能在 SUM 这样的聚合函数上使用 where 子句,这应该移到 HAVING 子句中。
  • @engineersmnky 一些数据库确实允许这样做,但你说得非常对,结果可能不是你真正想要的。
  • 有趣的是,我没有遇到任何这些数据库,您介意启发我吗?
  • SQLite,我认为例如 MySQL 将允许查询,即使它非常模棱两可。
  • @engineersmnky 实际上它看起来就像它只是 SQLite。有趣的是SELECT COALESCE("stocks"."quantity", 0) AS c_count FROM "stocks" WHERE (c_count = 0) 没有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-04
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多