【问题标题】:Cast as Float returns ActiveRecord::StatementInvalid: Mysql2::ErrorCast as Float 返回 ActiveRecord::StatementInvalid: Mysql2::Error
【发布时间】:2017-02-26 21:04:15
【问题描述】:

所以我在 Rails 4.2.7 中执行以下操作

@product.reviews.select('CAST(answer_1 AS FLOAT) AS answer_1')

不幸的是,这会返回

ActiveRecord::StatementInvalid: Mysql2::Error: 
You have an error in your SQL syntax; check the manual that corresponds to your 
MySQL server version for the right syntax to use near 
'FLOAT) AS answer_1 FROM `reviews` WHERE `reviews`.`product_id` = 1' at line 1: 
SELECT CAST(answer_1 AS FLOAT) AS answer_1 
FROM `reviews` WHERE `reviews`.`product_id` = 1

【问题讨论】:

  • 真的,我需要做的是AVG(CAST(answer_1 AS FLOAT)) AS answer_1,但我无法让演员表工作。

标签: mysql sql ruby-on-rails activerecord rails-activerecord


【解决方案1】:

显然 MySQL 的 cast 函数无法将 float 理解为数据类型。 fine manual 告诉您查看 convert 的类型,列表中没有 float

MySQL 的cast 确实支持decimal(m,n),但是您必须自己选择适当的比例和精度值。或者,如果整数合适,您可以使用 cast(answer_1 as signed)cast(answer_1 as unsigned)

如果您实际上是在平均并且 answer_1 已经是一个数字,那么您不需要在 avg 返回一个浮点值(但文档当然没有明确说明) )。

您也可能会遇到一些问题,因为您的列别名:

avg(answer_1) as answer_1

与现有列同名。 ActiveRecord 可能会对名称感到困惑,并尝试将平均值转换为answer_1 列的任何值。使用不同的名称应该会更好。

【讨论】:

  • 这件事的奇怪之处在于,做AVG(answer_1) AS answer_1 会通过我的查询@product.reviews.select('AVG(answer_1) AS answer_1') 返回一个Fixnum < Integer,但是当我使用AVG 进行原始SQL 查询时(reviews.answer_1)我得到了一个花车回来。
  • 这表明answer_1 列是一个整数,而ActiveRecord 正在将您的avg(answer_1) as answer_1 转换为Fixnum,因为它认为任何称为answer_1 的东西都应该是一个整数。尝试在您的 select 通话中为其指定一个不同的别名。
  • 宾果游戏。 .select('AVG(answer_1) AS foo') 给了我一个浮动
猜你喜欢
  • 2018-03-15
  • 2016-09-13
  • 1970-01-01
  • 2018-08-05
  • 2014-07-10
  • 2015-12-26
  • 2013-05-29
  • 2021-12-09
  • 1970-01-01
相关资源
最近更新 更多