ruby-on-rails - Rails + Postgres : How to `order` Using Multiple Possibly Nil Columns?

标签 ruby-on-rails ruby postgresql arel

我在 Rails 应用程序中有一个表,它存储两个属性,其中一个是时间戳(sent_at,如 Time.now 中所示),另一个是时间戳日期(sent_on,如 Time.now.to_date)。

我想按 sent_at|sent_on 升序检索行(其中任何一个都可以是 nil):

Order.first(20).order(sent_at: :asc, sent_on: :asc) # this doesn't work

你会怎样做?

谢谢!

最佳答案

我冒昧地使用了 comment of Islingre 。您可以使用COALESCE按顺序评估它的参数。将返回第一个非 NULL 的参数。

named_function = ::Arel::Nodes::NamedFunction
orders = Order.arel_table
Order.order(named_function.new('COALESCE', [orders[:sent_at], orders[:send_on]]).asc).first(20)

# results in:
#
# SELECT "orders".*
# FROM "orders"
# ORDER BY COALESCE("orders"."send_at", "orders"."send_on") ASC
# LIMIT 20

或者,如果您不介意使用纯 SQL。

Order.order('COALESCE(sent_at, sent_on) ASC').first(20)

# results in:
#
# SELECT "orders".*
# FROM "orders"
# ORDER BY COALESCE(sent_at, sent_on) ASC
# LIMIT 20

关于ruby-on-rails - Rails + Postgres : How to `order` Using Multiple Possibly Nil Columns?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57914268/

相关文章:

sql - 如何在 SQL 查询中添加条件语句?

javascript - rake 数据库 :create - Could not find a JavaScript runtime

ruby-on-rails - 多态 Controller 和调用对象

ruby - HAML - 一个非常奇怪的缩进差异 - 错误?

ruby-on-rails - 使用 ERB 打印数组元素

Ruby 解析字符串并返回数组

ruby-on-rails - 是否可以在不先阅读的情况下更改 rails 中的记录

html - 无法使用 Gmail API + rails 在 HTML 中显示嵌入式图像

postgresql - 消除 Postgres 中的重复行

postgresql - 创建多个部分索引,只扫描一次(Postgresql)?