在实际项目中,有时会碰到数据库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 1
when 'Banana' then 2
when '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
BEGIN
declare @returnVal int
select @returnVal=supBranchnum from Branch where Branchnum=@Branchnum
if(@returnVal=1)
Begin
set @returnVal=@Branchnum
End
return @returnVal
END
GO

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

  select branchnum,branchname,supbranchnum from branch
order 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

  

SqlServer自定义排序的更多相关文章

  1. Java集合框架实现自定义排序

    Java集合框架针对不同的数据结构提供了多种排序的方法,虽然很多时候我们可以自己实现排序,比如数组等,但是灵活的使用JDK提供的排序方法,可以提高开发效率,而且通常JDK的实现要比自己造的轮子性能更优 ...

  2. DataTable自定义排序

    使用JQ DataTable 的时候,希望某列数据可以进行自定义排序,操作如下:(以中文排序和百分比排序为例) 1:定义排序类型: //百分率排序 jQuery.fn.dataTableExt.oSo ...

  3. 干货之UICollectionViewFlowLayout自定义排序和拖拽手势

    使用UICollectionView,需要使用UICollectionViewLayout控制UICollectionViewCell布局,虽然UICollectionViewLayout提供了高度自 ...

  4. DataGridView 绑定List集合后实现自定义排序

    这里只贴主要代码,dataList是已添加数据的全局变量,绑定数据源 datagridview1.DataSource = dataList,以下是核心代码. 实现点击列表头实现自定义排序 priva ...

  5. 【转】c++中Vector等STL容器的自定义排序

    如果要自己定义STL容器的元素类最好满足STL容器对元素的要求    必须要求:     1.Copy构造函数     2.赋值=操作符     3.能够销毁对象的析构函数    另外:     1. ...

  6. mysql如何用order by 自定义排序

    mysql如何用order by 自定义排序 id name roleId aaa bbb ccc ddd eee ,MySQL可以通过field()函数自定义排序,格式:field(value,st ...

  7. python 自定义排序函数

    自定义排序函数 Python内置的 sorted()函数可对list进行排序: >>>sorted([36, 5, 12, 9, 21]) [5, 9, 12, 21, 36] 但 ...

  8. 定制对ArrayList的sort方法的自定义排序

    java中的ArrayList需要通过collections类的sort方法来进行排序 如果想自定义排序方式则需要有类来实现Comparator接口并重写compare方法 调用sort方法时将Arr ...

  9. Qt之QHeaderView自定义排序(获取正确的QModelIndex)

    简述 前几节中分享过关于自定义排序的功能,貌似我们之前的内容已经可以很好地解决排序问题了,但是,会由此引发一些很难发现的问题...比如:获取QModelIndex索引错误. 下面,我们先来实现一个整行 ...

随机推荐

  1. 你所不知道的html5与html中的那些事(五)——web图像

    文章简介:       现在的页面,一般都离不开图像,而怎么做才能让我们的页面中的图像加载的又快又好呢?在优化页面速度的时候还有什么事是你所不知道的呢?     下面看看今天我为大家带来了哪些关于we ...

  2. xml约束(转)

    在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束. 常用的约束技术XML DTD :XML Schema. XML Schema 也是一种用于定义和描述 XML 文档 ...

  3. 使用go实现基于命令行的计算器程序

    项目目录结构 calcs.go源文件 package main import ( "fmt" "os" "strconv" "my ...

  4. POJ 1127 Jack Straws (线段相交)

    题意:给定一堆线段,然后有询问,问这两个线段是不是相交,并且如果间接相交也可以. 析:可以用并查集和线段相交来做,也可以用Floyd来做,相交就是一个模板题. 代码如下: #pragma commen ...

  5. 深度解析VC中的消息传递机制

    摘要:Windows编程和Dos编程,一个很大的区别就是,Windows编程是事件驱动,消息传递的.所以,要学好Windows编程,必须 对消息机制有一个清楚的认识,本文希望能够对消息的传递做一个全面 ...

  6. Vue拖拽组件列表实现动态页面配置

    需求描述 最近在做一个后台系统,有一个功能产品需求是页面分为左右两部分,通过右边的组件列表来动态配置左边的页面视图,并且左边由组件拼装起来的视图,可以实现上下拖拽改变顺序,也可以删除. 根据这个需求我 ...

  7. css清除浮动的方法总结

    在各种浏览器中显示效果也有可能不相同,这样让清除浮动更难了,下面总结8种清除浮动的方法,测试已通过 ie chrome firefox opera,需要的朋友可以参考下     清除浮动是每一个 we ...

  8. BZOJ 1069: [SCOI2007]最大土地面积(旋转卡壳)

    题目链接~ 1069: [SCOI2007]最大土地面积 思路很简单,极角排序求完凸包后,在凸包上枚举对角线,然后两边分别来两个点旋转卡壳一下,搞定! 不过计算几何的题目就是这样,程序中间的处理还是比 ...

  9. 如何在JMeter中使用ForEach控制器

    Jmeter中的ForEach Controller遍历变量数组. 在这个JMeter教程中,我们将使用ForEach控制器循环访问JSON数组. 有时我们需要解析响应并提取某些信息.例如,在测试AP ...

  10. 2017EIS高校运维大赛ctf wirteup

    php代码审计 题目很简单GET传入参数args然后eval(var_dump($$args))直接传入全局变量GLOBALS就能执行 php是最好的语言 .bak泄露拿到源码 <?php $v ...