• 利用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'进行排序。

  • 相关阅读:
    The type or namespace name 'Windows' does not exist in the namespace....
    WCF 事件处理
    ASP.Net程序在IIS7的部署问题
    Oracle Package的全局变量与Session
    [ASP.NET]C1Webgrid中实现编辑和计算
    EXCEL妙用:选取单元格时改变整行的背景色
    [转]22 个精美的网站管理后台模板推荐
    [转]C#开发Active控件(二)
    Oracle获取时间差的技巧
    C#里的Random
  • 原文地址:https://www.cnblogs.com/objectnull/p/9105234.html
Copyright © 2020-2023  润新知