利用case when进行sql动态排序

一个sql动态排序的问题,弄了我很久很久。就是无法解决。结果在网上找了一段资源帮我解决。如下:

在日常的報表中常用到排序,有些是多字段的升,降序,一般有兩種方法,如下所示:

CREATE   TABLE  #TMP
(
    row    
int
    id    
nvarchar ( 10 ), 
    des    
nvarchar ( 20 )
)
GO

INSERT   INTO  #TMP(row, id, des)
        
SELECT   1 ' 1 ' ' 30 '
UNION      SELECT   2 ' 2 ' ' 10 '
UNION      SELECT   3 ' 1 ' ' 10 '
UNION      SELECT   4 ' 3 ' ' 15 '

-- '1'=>row desc,'2'=>id asc,row desc '3'=>id asc, des desc
DECLARE   @OrderType      nvarchar ( 1 )    
SET   @OrderType = ' 3 '

-- EXEC作法
DECLARE   @sqlstr   nvarchar ( 200 )
SET   @sqlstr = ' SELECT * FROM #TMP '
IF   @OrderType = ' 1 '
    
SET   @sqlstr = @sqlstr + '  ORDER BY row DESC '
ELSE   IF   @OrderType = ' 2 '
    
SET   @sqlstr = @sqlstr + '  ORDER BY id, row DESC '
ELSE   IF   @OrderType = ' 3 '
    
SET   @sqlstr = @sqlstr + '  ORDER BY id, des DESC '
EXEC ( @sqlstr )
-- 以上方法不易閱讀及維護,還有額外變量

SELECT      *  
FROM     #TMP 
ORDER   BY   CASE   WHEN      @OrderType = ' 1 '   THEN  row  END   DESC
         
CASE   WHEN      @OrderType = ' 2 '   THEN  id  END ,
         
CASE   WHEN      @OrderType = ' 2 '   THEN  row  END   DESC ,
         
CASE   WHEN      @OrderType = ' 3 '   THEN  id  END ,
         
CASE   WHEN      @OrderType = ' 3 '   THEN  DES  END   DESC ;
-- 結果一致,CASE WHEN 方法不存在以上問題

这里我一直产生了一个疑虑:case问什么可以进行多次的使用来进行排序呢。原理很简单:order by 是针对查询出来的结果集进行排序。现有结果集,然后再由排序。第一个case只是针对@OrderType=1的进行排序,第二个则是增对@OrderType='2'进行排序。

菜鸟一直纠结于第一种一次使用case完成任务,这次印象非常深刻


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值