order by case when

 http://topic.csdn.net/t/20040127/18/2682980.html

语法
[   ORDER   BY   {   order_by_expression   [   ASC   |   DESC   ]   }         [   ,...n   ]   ]

参数
order_by_expression

指定要排序的列。可以将排序列指定为列名或列的别名(可由表名或视图名限定)和表达式,或者指定为代表选择列表内的名称、别名或表达式的位置的负整数。  

可指定多个排序列。ORDER   BY   子句中的排序列序列定义排序结果集的结构。

ORDER   BY   子句可包括未出现在此选择列表中的项目。然而,如果指定   SELECT   DISTINCT,或者如果   SELECT   语句包含   UNION   运算符,则排序列必定出现在选择列表中。

此外,当   SELECT   语句包含   UNION   运算符时,列名或列的别名必须是在第一选择列表内指定的列名或列的别名。


说明     在   ORDER   BY   子句中不能使用   ntext、text   和   image   列。


ASC

指定按递增顺序,从最低值到最高值对指定列中的值进行排序。

DESC

指定按递减顺序,从最高值到最低值对指定列中的值进行排序。

空值被视为最低的可能值。

对   ORDER   BY   子句中的项目数没有限制。然而,对于排序操作所需的中间级工作表的大小有   8,060   字节的限制。这限制了在   ORDER   BY   子句中指定的列的合计大小。

===

大家还是没有明白我的意思,还是举例说明吧
有这样一个表tt(bmid   int,boardid   int,parentid   int)
如果用select   *   from   tt;结果集如下:
bmid                 boardid           parentid        
-----------   -----------   -----------  
1                       1                       9
2                       2                       17
5                       3                       18
9                       0                       0
15                     0                       0
16                     4                       17
17                     0                       0
18                     0                       0
5                       3                       18

(所影响的行数为   9   行)
而用select   *   from   tt   order   by   (case   when   parentid=0   then   bmid   else   parentid   end),parentid,bmid,boardid;结果集如下:
bmid                 boardid           parentid        
-----------   -----------   -----------  
9                       0                       0
1                       1                       9
15                     0                       0
17                     0                       0
2                       2                       17
16                     4                       17
18                     0                       0
5                       3                       18
5                       3                       18

(所影响的行数为   9   行)
我不明白的是第二种情况为什么不是以下这种情况呢?
bmid                 boardid           parentid        
-----------   -----------   -----------  
9                       0                       0
15                     0                       0
17                     0                       0
18                     0                       0
1                       1                       9
2                       2                       17
16                     4                       17
5                       3                       18
5                       3                       18

(所影响的行数为   9   行)

========

create   table   tt
(
bmid   int,
boardid   int,
parentid   int
)

insert   into   tt   values(1,   1,   9)
insert   into   tt   values(2,   2,   17)
insert   into   tt   values(5,   3,   18)
insert   into   tt   values(9,   0,   0)
insert   into   tt   values(15,   0,   0)
insert   into   tt   values(16,   4,   17)
insert   into   tt   values(17,   0,   0)
insert   into   tt   values(18,   0,   0)
insert   into   tt   values(5,   3,   18)
go

--你的方法
select   *   from   tt   order   by   (case   when   parentid=0   then   bmid   else   parentid   end),parentid,bmid,boardid;

--等效的方法
select   (case   when   parentid=0   then   bmid   else   parentid   end)   as   myid,   *  
from   tt
order   by   myid,parentid,bmid,boardid

--结果必然是
myid                 bmid                 boardid           parentid        
-----------   -----------   -----------   -----------  
9                       9                       0                       0
9                       1                       1                       9
15                     15                     0                       0
17                     17                     0                       0
17                     2                       2                       17
17                     16                     4                       17
18                     18                     0                       0
18                     5                       3                       18
18                     5                       3                       18

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值