gpt4 book ai didi

ruby-on-rails - 取 postgres 和 sqlite3 中 bool 列的平均值

转载 作者:行者123 更新时间:2023-11-29 12:05:56 34 4
gpt4 key购买 nike

我有很多 ActiveRecord 查询使用表达式的平均值来查找百分比,例如:

def self.undergraduate_degree_percentage
self.average("undergrad_college_name != ''")
end

这些是为 sqlite3(开发数据库)构建的,但在 postgres(生产数据库)中分解,因为 pg 处理 bool 值的方式不同。生成的错误类似于 ERROR: function avg(boolean) does not exist at character 8。有没有一种优雅的方法可以使这种类型的查询同时适用于 sqlite3 和 PG?

最佳答案

数据库中的 bool 值很难移植:

  1. MySQL 和 SQLite 原生使用 C 风格的 bool 值。
  2. SQLite 的 ActiveRecord 驱动程序有时会错误 uses 't' and 'f' strings for booleans .这可能会在较新的版本中得到修复。
  3. PostgreSQL 有一个原生的 bool 类型。
  4. 其他数据库做其他事情。
  5. 有时会自动转换为数值,有时则不会。
  6. ?
  7. Profit.

如果您想以可移植的方式执行此操作,那么您应该手动转换 bool 值。在你的情况下,你很幸运有一个产生原生 bool 值的表达式,所以你不必担心 AR 的 SQLite 脑损伤。一个简单的 CASE 应该让事情在任何地方都一样:

self.average(%q{
case
when undergrad_college_name != '' then 1.0
else 0.0
end
})

这将为您提供浮点结果(可能是 Float 或 BigDecimal),然后您可以从那里决定如何处理它。

关于ruby-on-rails - 取 postgres 和 sqlite3 中 bool 列的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15420301/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com