sql - Rails ActiveRecord - 按匹配号查询订单
问题描述
我有一个模型叫Location
. 该表有 2 个我想排序的字段:(rating
整数)和name
(字符串)。
我想按名称的字母顺序排序,但如果评级是 5,我希望该评级排在第一位。如果评级是 5 以外的任何其他值,我希望它们在 5 之后按字母顺序公正地显示。
这可能与SQL有关吗?我知道我显然可以用 Ruby 的 Array#sort 来做到这一点,但我想把它作为一个查询来做。
解决方案
是的,你可以用一点 SQL 来做到这一点。您需要case
在 ORDER BY 中包含一个表达式:
case rating when 5 then 0 else 1 end
这大致相当于rating == 5 ? 0 : 1
在 Ruby 中,因此它将所有评级为 5 的位置放在首位,其他位置放在后面。然后排序name
:
Location.order(Arel.sql('case rating when 5 then 0 else 1 end, name'))
当然,您可以将其隐藏在一个范围内,以使事情更易于阅读和理解。
推荐阅读
- postgresql - 使用来自自身的值更新表,但从不同的表中选择标准
- javascript - Selectize.js - 如何在使用 ajax 请求创建后更新选项并选择最后一个?
- python - 不明白这个 pytz AttributeError: 'UTC' object has no attribute 'utc_timezone'
- flutter - Flutter ListTile 缺少必需的参数
- javascript - 未在页面上隐藏 lit-element 应用程序的表单
- python - Python程序无法正确响应非英文键盘输入
- java - 无法使用 htmlunit 驱动程序执行单击或发送键
- intellij-idea - 数字占位符,例如 IntelliJ 实时模板中的 VSCode 片段
- python - 我如何将此 json.dumps() 传递给要使用的函数?
- python - 基于 Python/MySQL 的管道中的字符编码问题