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)
下面是一个例子:
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 使用两个存储过程输入参数。
这对我来说很好 - ( 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)