加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – Active Record Query中基于时间的优先级

发布时间:2020-12-12 16:24:26 所属栏目:MsSql教程 来源:网络整理
导读:我有一个包含作业列表的表,显示时通常按created_at字段降序排序.我正在添加一个“特色”布尔标志,这将增加客户能够更好地了解他们的工作列表的能力.如果作业少于X天,我希望将精选列表固定在搜索结果的顶部.如何通过现有查询修改以支持此功能? Jobs.where("ex
我有一个包含作业列表的表,显示时通常按created_at字段降序排序.我正在添加一个“特色”布尔标志,这将增加客户能够更好地了解他们的工作列表的能力.如果作业少于X天,我希望将精选列表固定在搜索结果的顶部.如何通过现有查询修改以支持此功能?
Jobs.where("expiration_date >= ? and published = ?",Date.today,true).order("created_at DESC")

当前查询将拉回由created_at排序的所有当前已发布作业.

解决方法

与其他一些数据库(如Oracle)不同,PostgreSQL具有完全功能的 boolean类型.您可以直接在ORDER BY子句中使用它而不应用CASE语句 – 这些对于更复杂的情况非常有用.

布尔值的排序顺序是:

FALSE -> TRUE -> NULL

如果ORDER BY bool_expressionDESC,则将订单反转为:

NULL -> TRUE -> FALSE

如果你想先TRUE而NULL最后,请使用NULLS LAST clause of ORDER BY

ORDER BY (featured AND created_at > now() - interval '11 days') DESC NULLS LAST,created_at DESC

当然,如果feature或created_at可以为NULL,则NULLS LAST仅相关.如果列定义为NOT NULL,则不要打扰.

此外,FALSE将在NULL之前排序.如果你不想区分这两者,你可以回到CASE声明,也可以扔到NULLIF()COALESCE().

ORDER BY NULLIF(featured AND created_at > now() - interval '11 days'),FALSE)
                                                                DESC NULLS LAST,created_at DESC

性能

请注意,我如何使用:

created_at > now() - interval '11 days'

并不是:

now() - created_at < interval '11 days'

在第一个示例中,右侧的表达式是一次计算的常量.然后可以使用索引来查找匹配的行.效率很高.

后者通常不能与索引一起使用.必须为每一行计算一个值,然后才能根据右边的常量表达式检查它.如果可以避免,请不要这样做.永远!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读