按一列排序,但如果另一列为空,则推到最后

时间:2019-04-11 22:41:47

标签: sql postgresql sql-order-by rank

我正在尝试根据排名对一些结果进行排序,但是我想将没有图像的结果推到最后。

我有一个包含instructor_profiles的表和另一个users表。我正在尝试根据密集排名对讲师的个人资料进行排序,但想在结尾显示没有图片的人。

我的排名很好,但是我不知道该怎么做。

例如:

SELECT ts_rank_cd("instructor_profiles"."search_vector", plainto_tsquery('english', 'skate')),
 "instructor_profiles".id, 
 "instructor_profiles".title, 
 "instructor_profiles".image, 
 users.avatar
 FROM "instructor_profiles" LEFT JOIN users ON users.id = instructor_profiles.user_id 
 WHERE ("instructor_profiles"."search_vector" @@ plainto_tsquery('english', 'skate')) 
 ORDER BY 
        ts_rank_cd("instructor_profiles"."search_vector", plainto_tsquery('english', 'skate')) desc
 LIMIT 50 OFFSET 0

将得到以下结果: results

然后我尝试将ORDER BY更改为

ORDER BY instructor_profiles.image NULLS LAST,
users.avatar NULLS LAST,
ts_rank_cd("instructor_profiles"."search_vector", plainto_tsquery('english', 'skate')) desc

但是然后我的排名完全被搞砸了: results 2

1 个答案:

答案 0 :(得分:1)

在订购时使用CASE,例如:

 ORDER BY CASE 
            WHEN instructor_profiles.image IS NOT NULL 
              OR users.avatar IS NOT NULL 
            THEN 0 
            ELSE 1  
          END ASC,
          ts_rank_cd DESC

这不是由imageavatar来排序的,仅仅是因为它是否是NULL,而所有未得到平等的对待和您的排名功能然后将适用。