动态订单方向

mar*_*kiz 24 sql sql-server stored-procedures case sql-order-by

我编写一个SP作为参数列接受排序和方向.

我不想使用动态SQL.

问题是设置方向参数.

这是部分代码:

SET @OrderByColumn = 'AddedDate'
SET @OrderDirection = 1;

…

ORDER BY 
    CASE WHEN @OrderByColumn = 'AddedDate' THEN CONVERT(varchar(50), AddedDate)
        WHEN @OrderByColumn = 'Visible' THEN CONVERT(varchar(2), Visible)
        WHEN @OrderByColumn = 'AddedBy' THEN AddedBy
        WHEN @OrderByColumn = 'Title' THEN Title    
    END
Run Code Online (Sandbox Code Playgroud)

Gar*_*ill 31

您可以有两个几乎相同的ORDER BY项目,一个ASC和一个DESC,并扩展您的CASE语句以使其中一个或另一个始终等于单个值:

ORDER BY
      CASE WHEN @OrderDirection = 0 THEN 1
      ELSE
           CASE WHEN @OrderByColumn = 'AddedDate' THEN CONVERT(varchar(50), AddedDate)
                WHEN @OrderByColumn = 'Visible' THEN CONVERT(varchar(2), Visible)
                WHEN @OrderByColumn = 'AddedBy' THEN AddedBy
                WHEN @OrderByColumn = 'Title' THEN Title
           END
      END ASC,
      CASE WHEN @OrderDirection = 1 THEN 1
      ELSE
           CASE WHEN @OrderByColumn = 'AddedDate' THEN CONVERT(varchar(50), AddedDate)
                WHEN @OrderByColumn = 'Visible' THEN CONVERT(varchar(2), Visible)
                WHEN @OrderByColumn = 'AddedBy' THEN AddedBy           
                WHEN @OrderByColumn = 'Title' THEN Title
           END
      END DESC
Run Code Online (Sandbox Code Playgroud)


gbn*_*gbn 12

您可以使用ROW_NUMBER简化CASE,ROW_NUMBER对您的数据进行排序并有效地将其转换为方便的整数格式.特别是因为问题被标记为SQL Server 2005

这也很容易扩展到处理二级和三级种类

我使用乘法器再次简化了实际的select语句,并降低了ORDER BY中RBAR评估的几率

DECLARE @multiplier int;

SELECT @multiplier = CASE @Direction WHEN 1 THEN -1 ELSE 1 END;

SELECT
     Columns you actually want
FROM
    (
    SELECT
         Columns you actually want,
         ROW_NUMBER() OVER (ORDER BY AddedDate) AS AddedDateSort,
         ROW_NUMBER() OVER (ORDER BY Visible) AS VisibleSort,
         ROW_NUMBER() OVER (ORDER BY AddedBy) AS AddedBySort,
         ROW_NUMBER() OVER (ORDER BY Title) AS TitleSort
    FROM
         myTable
    WHERE
         MyFilters...
    ) foo
ORDER BY
     CASE @OrderByColumn
        WHEN 'AddedDate' THEN AddedDateSort
        WHEN 'Visible' THEN VisibleSort    
        WHEN 'AddedBy' THEN AddedBySort
        WHEN 'Title' THEN TitleSort
     END * @multiplier;
Run Code Online (Sandbox Code Playgroud)


Ale*_*ack 5

下面是一个例子:

CREATE PROCEDURE GetProducts 
( 
    @OrderBy      VARCHAR(50), 
    @Input2       VARCHAR(30) 
) 
AS 
BEGIN 
    SET NOCOUNT ON 

    SELECT Id, ProductName, Description, Price, Quantity 
    FROM Products 
    WHERE ProductName LIKE @Input2 
    ORDER BY 
        CASE             
            WHEN @OrderBy = 'ProductNameAsc' THEN ProductName 
        END ASC, 
        CASE 
            WHEN @OrderBy = 'ProductNameDesc' THEN ProductName 
        END DESC 

END
Run Code Online (Sandbox Code Playgroud)

从这里:

http://www.domincpettifer.co.uk/Blog/21/dynamic-conditional-order-by-clause-in-sql-server-t-sql

升序和降序操作需要分组到单独的 CASE 语句中,用逗号分隔。在您的服务器端代码/脚本中,请确保按字符串将“Asc”或“Desc”附加到 order 中,或者如果需要,您可以为列名和 order by direction 使用两个存储过程输入参数。

  • @markiz & Alex:如果 WHEN 条件都不为真,并且没有 ELSE 条件,则整个 CASE 表达式的计算结果为 null。由于所有行都为空,因此 ORDER BY 子句的那部分不会改变顺序。如果输入是 ProdcuctNameDesc,则为每一行排序的值将按 NULL 排序 ASC 和 ProductName 排序 DESC & ProductNameASC 将按 ProductName ASC、NULL Desc 排序 (4认同)

Aru*_*E S 5

这对我来说很好 - ( where, order by, direction, Pagination)

parameters

@orderColumn  int ,
@orderDir  varchar(20),
@start  int ,
@limit  int


select * from items

order by 

CASE WHEN @orderColumn = 0 AND @orderdir = 'desc' THEN items.[CategoryName] END DESC,    
CASE WHEN @orderColumn = 0 AND @orderdir = 'asc' THEN items.[CategoryName] END ASC,    
CASE WHEN @orderColumn = 1 AND @orderdir = 'desc' THEN items.[CategoryValue] END DESC,
CASE WHEN @orderColumn = 1 AND @orderdir = 'asc' THEN items.[CategoryValue] END ASC,
CASE WHEN @orderColumn = 2 AND @orderdir = 'desc' THEN items.[CreatedOn] END DESC,
CASE WHEN @orderColumn = 2 AND @orderdir = 'asc' THEN items.[CreatedOn] END ASC

OFFSET @start ROWS FETCH NEXT @limit ROWS ONLY
Run Code Online (Sandbox Code Playgroud)