加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – Rails:将nils排序到范围的末尾?

发布时间:2021-03-16 14:25:26 所属栏目:MsSql教程 来源:网络整理
导读:所以,我的Photo模型中有以下范围: scope :best,order(:average_rating.desc) 唯一的问题是,事后评级被添加到模型中,因此生产应用程序有很多记录,其中average_rating为零.当我调用这个范围时,它首先返回所有的nils – 事实上它应该是相反的,nils应该是最后的(

所以,我的Photo模型中有以下范围:

scope :best,order(:average_rating.desc)

唯一的问题是,事后评级被添加到模型中,因此生产应用程序有很多记录,其中average_rating为零.当我调用这个范围时,它首先返回所有的nils – 事实上它应该是相反的,nils应该是最后的(它们是尚未评级的照片).

如何将nils排序到此范围的末尾?

解决方法

我在游戏中有点迟了但这又刚刚出现,解决方案真的不那么难.

一个可移植的解决方案是使用CASE将NULL转换为将结束的东西.如果您的评分为非负数,那么-1是一个不错的选择:

order('case when average_rating is null then -1 else average_rating end desc')

相反,使用COALESCE可以在许多数据库中工作,并且比CASE噪音小得多:

order('coalesce(average_rating,-1) desc')

如果你想要一个ASC排序,那么上面的方法会把NULL放在开头.如果你最后想要它们那么你会使用比最高等级更大的东西而不是-1.例如,如果您将事物从1评级为5,则可以使用11来替换NULL:

order('case when average_rating is null then 11 else average_rating end asc')
order('coalesce(average_rating,11) asc')

大多数人会使用10,但有时你需要更大声一点,所以我们去11.

你不能真正依赖数据库在开头或结尾放置NULL,所以最好是明确的,即使你只是在提醒你的未来 – 你已经处理过NULL的情况.

(编辑:辽源站长网)

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

    推荐文章
      热点阅读