首页 技术 正文
技术 2022年11月15日
0 收藏 456 点赞 2,355 浏览 3481 个字

  在实际项目中,有时会碰到数据库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、多字段关联排序

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

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

branchnumbranchnamesupbranchnum
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。排序结果如下:

branchnumbranchnamesupbranchnum
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

  

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,082
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,556
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,405
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,179
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,815
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,898