利用case when进行sql动态排序

本文介绍两种SQL动态排序的方法:EXEC法和CASEWHEN法。通过示例展示了如何根据不同的排序类型(如按行号降序、ID升序等)动态调整排序规则。

一个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'进行排序。

转载于:https://www.cnblogs.com/objectnull/p/9105234.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值