在实际项目中,有时会碰到数据库SQL的特殊排序需求,举几个例子,作为参考。

1、自定义优先级

  一种常见的排序需求是指定某个字段取值的优先级,根据指定的优先级展示排序结果。比如如下表:

Create TABLE Fruit (id INT IDENTITY(1, 1) ,Name VARCHAR(50));INSERT  INTO Fruit (Name) VALUES  ('Apple');
INSERT  INTO Fruit (Name) VALUES  ('Watermelon');
INSERT  INTO Fruit (Name) VALUES  ('Strawberry');
INSERT  INTO Fruit (Name) VALUES  ('Banana');
INSERT  INTO Fruit (Name) VALUES  ('Pear');

  如果按照Name字段排序,结果是

Apple
Banana
Pear
Strawberry
Watermelon

  如果想把某个字段优先级提高,用如下方法:

select name from fruit
order by case name when 'Strawberry' then 1when 'Banana' then 2when 'Apple' then 3 else 4
end

  指定了Strawberry、Banana、Apple三条记录的排序优先级,则这三个按照指定的结果排序,其他的都指定为4,排在后面。

Strawberry
Banana
Apple
Watermelon
Pear

  如果不指定else 4这句呢,结果如下:

Watermelon
Pear
Strawberry
Banana
Apple

  因为不指定就是NULL,在排序中,NULL的优先级最高,排在前面。

2、多字段关联排序

  考虑如下需求:有一个机构表,需要按照深度优先排序,也就是一个机构的下级机构和下下级机构的优先级比同级机构高。

  表结构有三个字段:机构号、机构名称、上级机构号:

branchnum branchname  supbranchnum
1       本部          00000
2       北京市分行       00001
3       天津市分行       00001
4       河北省分行       00001
5       山西省分行       00001
2001        北京中关村中心支行   00002
2002        北京王府井支行     00002
2006        北京奥运村支行     00002
2010        北京东城支行      00002
2026        北京西城支行      00002
2044        北京崇文支行      00002
2061        北京宣武支行      00002
2077        北京朝阳支行      00002
2099        北京海淀支行      00002
2135        北京丰台支行      00002
2137        北京方庄中心支行    00002
2154        北京首都机场支行    00002
2160        北京通州支行      00002
2169        北京大兴支行      00002
2175        北京世纪财富中心支   00002
2178        北京顺义支行      00002
2185        北京昌平支行      00002
2194        北京平谷支行      00002
2195        北京密云支行      00002
2198        北京怀柔支行      00002
2204        北京延庆支行      00002
2206        北京金融中心支行    00002
2209        北京中银大厦支行    00002
2210        北京石景山支行     00002
2211        北京商务区支行     00002
2227        北京使馆区支行     00002
2228        北京国际贸易中心支   00002
2231        北京上地支行  00002
2232        北京投资广场支行    00002
2233        北京雅宝路支行     00002
2354        天津大港支行      00003
2361        天津和平支行      00003
2382        天津河西支行      00003
2398        天津南开支行      00003
2412        天津红桥支行      00003
2423        天津河北支行      00003
2447        天津河东支行      00003
2463        天津津南支行      00003
2470        天津北辰支行      00003
2478        天津东丽支行      00003
2484        天津西青支行      00003
2492        天津武清支行      00003
2500        天津宝坻支行      00003
2504        天津汉沽支行      00003
2508        天津宁河支行      00003
2510        天津蓟县支行      00003
2519        天津静海支行      00003
2523        天津津钢支行      00003
2601        石家庄市机场路支行   00004
2626        石家庄市中山支行    00004
2652        石家庄市裕东支行    00004
2678        石家庄市裕华支行    00004
3451        太原鼓楼支行      00005
3479        太原平阳支行      00005
3494        太原并州支行      00005
3506        太原漪汾支行      00005

  可以写一个排序函数,对每一个机构计算它的排序值,排序值就等于上级机构号:

Create FUNCTION fn_compare
(@Branchnum int
)
RETURNS int
AS
BEGINdeclare @returnVal intselect @returnVal=supBranchnum from Branch where Branchnum=@Branchnumif(@returnVal=1)Beginset @returnVal=@BranchnumEndreturn @returnVal
END
GO

  然后通过如下语句查询排序结构:

  select branchnum,branchname,supbranchnum from branchorder by dbo.fn_compare(branchnum),branchnum

  因为fn_compare函数中,对一个机构和它下级机构返回的排序值(ReturnVal)相等,所以为了使上级机构号排在下级机构前面,需要使用第二个排序字段Branchnum。排序结果如下:

branchnum branchname  supbranchnum
1       本部        00000
2       北京市分行        00001
2001        北京中关村中心支行    00002
2002        北京王府井支行      00002
2006        北京奥运村支行      00002
2010        北京东城支行       00002
2026        北京西城支行       00002
2044        北京崇文支行       00002
2061        北京宣武支行       00002
2077        北京朝阳支行       00002
2099        北京海淀支行       00002
2135        北京丰台支行       00002
2137        北京方庄中心支行     00002
2154        北京首都机场支行     00002
2160        北京通州支行       00002
2169        北京大兴支行       00002
2175        北京世纪财富中心支  00002
2178        北京顺义支行       00002
2185        北京昌平支行       00002
2194        北京平谷支行       00002
2195        北京密云支行       00002
2198        北京怀柔支行       00002
2204        北京延庆支行       00002
2206        北京金融中心支行     00002
2209        北京中银大厦支行     00002
2210        北京石景山支行      00002
2211        北京商务区支行      00002
2227        北京使馆区支行      00002
2228        北京国际贸易中心支  00002
2231        北京上地支行   00002
2232        北京投资广场支行     00002
2233        北京雅宝路支行      00002
20170       北京房山支行       00002
3       天津市分行        00001
2354        天津大港支行       00003
2361        天津和平支行       00003
2382        天津河西支行       00003
2398        天津南开支行       00003
2412        天津红桥支行       00003
2423        天津河北支行       00003
2447        天津河东支行       00003
2463        天津津南支行       00003
2470        天津北辰支行       00003
2478        天津东丽支行       00003
2484        天津西青支行       00003
2492        天津武清支行       00003
2500        天津宝坻支行       00003
2504        天津汉沽支行       00003
2508        天津宁河支行       00003
2510        天津蓟县支行       00003
2519        天津静海支行       00003
2523        天津津钢支行       00003
4       河北省分行        00001
2601        石家庄市机场路支行    00004
2626        石家庄市中山支行     00004
2652        石家庄市裕东支行     00004
2678        石家庄市裕华支行     00004
5       山西省分行        00001
3451        太原鼓楼支行       00005
3479        太原平阳支行       00005
3494        太原并州支行       00005
3506        太原漪汾支行       00005

  

转载于:https://www.cnblogs.com/wangguanguo/p/8337715.html

SqlServer自定义排序相关推荐

  1. SQLServer空值排序

    这里写自定义目录标题 SQLServer空值排序 字段的值为null和非空,没有空字符串时 字段的值为null和非空,有空字符串时 SQLServer空值排序 SQLServer中遇到要把空值排到最前 ...

  2. 数据库中自定义排序规则,Mysql中自定义字段排序规则,Oracle中自定义字段排序规则,decode函数的用法,field函数的用法

    数据库中自定义排序 场景:有一张banner表,表中有一个status字段,有0, 1, 2三个状态位,我想要 1,0,2的自定义排序(这里是重点),然后再进行之上对sequence字段进行二次排序( ...

  3. SpringDataJpA复杂查询实现自定义排序

    需求: 列表页面实现按合同状态自定义排序 private Specification<TblContractPre> whereClause(final TblContractPre en ...

  4. .NET/C#中对自定义对象集合进行自定义排序的方法

    一个集合可否排序,要看系统知不知道排序的规则,像内建的系统类型,int ,string,short,decimal这些,系统知道怎么排序,而如果一个集合里面放置的是自定义类型,比如自己定义了一个Car ...

  5. MapReduce编程实例之自定义排序

    任务描述: 给出一组数据,自定义排序的样式,第一列降序,相同时第二列升序 example Data: 2013 1 2013 5 2014 5 2014 8 2015 9 2015 4 Code: p ...

  6. R语言dplyr包arrage函数排序dataframe实战:单列排序、多列排序、自定义排序

    R语言dplyr包arrage函数排序dataframe实战:单列排序.多列排序.自定义排序 目录 R语言dplyr包arrage函数排序dataframe实战:单列排序.多列排序

  7. pandas dataframe中的列进行重新排序、倒排、正排、自定义排序详解及实践

    pandas dataframe中的列进行重新排序,pandas dataframe列重排.倒排.正排.自定义排序详解及实践 实施数据构建: import pandas as pd import nu ...

  8. 先随机后排序的oracle,Oracle用decode函数或CASE-WHEN实现自定义排序

    Oracle用decode函数或CASE-WHEN实现自定义排序 1 问题 对SQL排序,只要在order by后面加字段就可以了,可以通过加desc或asc来选择降序或升序.但排序规则是默认的,数字 ...

  9. java hashmap 无序,【Java】HashMap自定义排序

    HashMap中的对象根据成员进行自定义排序 Map是Java中最常用的存储对象的集合类之一,存储在HashMap中的对象在取出时是无序的,下文以示例介绍了如果对HashMap中存储的对象根据成员进行 ...

最新文章

  1. 男人必看:最近在网上流传甚广的一个帖子
  2. JavaScript框架
  3. js jquery操作的方面xml dom html dom css dom
  4. Nginx+Firebug 让浏览器告诉你负载均衡将请求分到了哪台服务器
  5. 【BZOJ3712】Fiolki(并查集重构树)
  6. 分布式测试工具Beetle.DT的部署并进行HTTP,SQL,TCP压测
  7. LeetCode 727. 最小窗口子序列(滑动窗口)
  8. MYSQL电脑客户端免安装教程以及出现问题解决方案
  9. WAF自动化Fuzz工具-WAFNinja(绕WAF、绕过WAF)
  10. 华为发布MetaAAU 能耗降低30% 性能节能双提升
  11. 不到一年英伟达股价又翻番了,CFO说:感谢中国、感谢AI
  12. 20170908算法工程师在线笔试之jd编程思路
  13. 题目29:计算表达式
  14. animation动画不生效_css animation不动怎么办
  15. 科属种XML文档三级树状图浏览的实现
  16. 如何在iPhone或iPad上使用控制中心
  17. 英文美文欣赏之《小王子》
  18. python设置win10壁纸
  19. mysql on cascade_MySQL外键约束_ON DELETE CASCADE/ON UPDATE CASCADE
  20. windows下的中文文件名共享在linux下显示乱码的问题

热门文章

  1. dateformat 返回类型_SpringBoot返回date日期格式化
  2. 9月份计算机应用基础统考,2018年9月计算机应用基础统考题库-网考计算机应用基础真题1...
  3. matlab lpfilter.m,histroi/statmoments/lpfilter/dftuv的Matlab程序
  4. bootstraptable获得所有行_2020广汽本田安全中国行·首届道路安全创新大赛成功举办...
  5. matlab之norm函数
  6. UFLDL教程: Exercise:Self-Taught Learning
  7. 在local模式下的spark程序打包到集群上运行
  8. java ListMapString,Object遍历的方法
  9. redis服务器学习一
  10. Windows 10 常用的快捷键及常用指令