Rails + Postgres:如何使用多个可能为零的列来“排序”?
Rails + Postgres: How to `order` Using Multiple Possibly Nil Columns?
我在 Rails 应用程序中有一个 table,它存储两个属性,其中一个是时间戳(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
你会怎么做?
谢谢!
我冒昧地使用 . You can use 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
我在 Rails 应用程序中有一个 table,它存储两个属性,其中一个是时间戳(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
你会怎么做?
谢谢!
我冒昧地使用 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