暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL自定义排序

SQL数据库开发 2022-04-19
470
你有遇到过这样的场景吗?按指定的顺序输出结果,比如按“北京,天津,上海,重庆……”这样的顺序。
今天给大家介绍几种方法来求解这样的问题,我们先看下示例表:
这张表的数据是随机录进去的,下面我们希望按照我们指定的顺序输出为如下内容:
注意:这里既没有按照人口的多少排序,也没有按照GDP的多少排序,更加没有按照城市的拼音首字母排序,完全是按照我们自己的意愿进行排序。
方法一  ORDER BY CASE WHEN
通过在ORDER BY的时候,我们对想要的输出顺序使用CASE WHEN,将文本转化为可排序的数字来进行间接排序,具体代码如下:

SELECT * FROM CitysORDER BY CASE WHEN City='北京' THEN 1           WHEN City='天津' THEN 2     WHEN City='上海' THEN 3     WHEN City='重庆' THEN 4     WHEN City='广州' THEN 5END
复制

此方法针对比较简单的查询容易实现自定义排序,在比较复杂场景中使用起来有限制。
方法二 UNION ALL
使用UNION ALL的方法容易理解,但是代码会写的比较复杂,具体如下:

SELECT a.City,a.Population,a.GDP FROM(SELECT 1 Num,* FROM Citys WHERE City='北京'UNION ALLSELECT 2 Num,* FROM Citys WHERE City='天津'UNION ALLSELECT 3 Num,* FROM Citys WHERE City='上海'UNION ALLSELECT 4 Num,* FROM Citys WHERE City='重庆'UNION ALLSELECT 5 Num,* FROM Citys WHERE City='广州') aORDER BY a.Num
复制

我们通过增加一列自定义的Num,给查询出来的每一行记录赋一个值,这个值是我们输出的顺序,再通过子查询对这个自定义的Num进行排序即可。时常用在比较复杂的查询语句中,且需要自定义排序的场景下。
方法三 创建临时表
相比上面两种方法,创建临时表的方法可以极大的减少代码量。我们可以先创建一个按照我们希望输出的顺序的临时表Temp,具体如下:
当我们需要自定义排序输出时,可以直接关联该临时表,具体代码如下:

SELECT a.* FROM Citys aJOIN Temp b ON a.City=b.CityORDER BY b.Num
复制

这种方法相对于上面两种方法只需要更新临时表中的顺序即可,可以适应各种不同的场景。

最后给大家分享我写的SQL两件套:《SQL基础知识第二版》《SQL高级知识第二版》的PDF电子版。里面有各个语法的解释、大量的实例讲解和批注等等,非常通俗易懂,方便大家跟着一起来实操。
有需要的读者可以下载学习,在下面的公众号「数据前线」(非本号)后台回复关键字:SQL,就行
数据前线
——End——

后台回复关键字:1024,获取一份精心整理的技术干货

后台回复关键字:进群,带你进入高手如云的交流群。

推荐阅读

复制

文章转载自SQL数据库开发,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论