【问题标题】:How to make order by clause dynamic如何通过子句动态排序
【发布时间】:2015-12-25 15:47:49
【问题描述】:

我使用的是 SQL Server 2008,我想根据输入列名和排序顺序(asc/desc)对数据进行排序。如何使下面的查询动态化?

DECLARE @iColumnName VARCHAR(24);
DECLARE @iSortOrder VARCHAR(10);

SET @iColumnName = 'ReceiptLocation'; -- ReceiptLocation/DeliverLocation/NominationNbr
SET @iSortOrder = 'DESC'; -- DESC / ASC

SELECT sum(NominationNbr)
    ,sum(ReceiptLocation)
    ,sum(DeliverLocation)
FROM tables
GROUP BY NominationNbr
    ,ReceiptLocation
    ,DeliverLocation
ORDER BY CASE @iColumnName
        WHEN 'ReceiptLocation'
            THEN ReceiptLocation
        WHEN 'DeliverLocation'
            THEN DeliverLocation
        ELSE NominationNbr
        END   

        CASE @iSortOrder
        WHEN 'DESC'
            THEN DESC
        ELSE ASC
        END

【问题讨论】:

    标签: sql sql-server-2008 group-by sql-order-by


    【解决方案1】:

    您需要将两者结合起来。我建议使用这个相当笨重的代码:

    ORDER BY (CASE WHEN @iColumnName = 'ReceiptLocation' AND @iSortOrder = 'DESC'
                   THEN ReceiptLocation
              END) DESC,
             (CASE WHEN @iColumnName = 'ReceiptLocation' 
                   THEN ReceiptLocation
              END) ASC,
             (CASE WHEN @iColumnName = 'DeliverLocation' AND @iSortOrder = 'DESC'
                   THEN DeliverLocation
              END) DESC,
             (CASE WHEN @iColumnName = 'DeliverLocation' 
                   THEN DeliverLocation
              END) ASC,
             (CASE WHEN @iSortOrder = 'DESC'
                   THEN NominationNbr
              END) DESC,
             NominationNbr ASC
    

    每个CASE 语句都是一个单独的订单键。但是,如果它们不匹配,则值为NULL,因此键不会执行任何不匹配的操作。

    您也可以使用动态 SQL 来实现这一点。如果您有一个可用于ORDER BY 的简单查询和索引,那会更有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-26
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 2013-12-19
      • 2014-02-12
      • 2020-01-15
      • 1970-01-01
      相关资源
      最近更新 更多