动态订单方向
我编写了一个 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
I writing a SP that accepts as parameters column to sort and direction.
I don't want to use dynamic SQL.
The problem is with setting the direction parameter.
This is the partial code:
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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
您可以有两个几乎相同的
ORDER BY
项,一个ASC
和一个DESC
,并扩展您的CASE
语句使其中一个或另一个始终等于单个值:You could have two near-identical
ORDER BY
items, oneASC
and oneDESC
, and extend yourCASE
statement to make one or other of them always equal a single value:您可以使用 ROW_NUMBER 来简化 CASE,它对数据进行排序并有效地将其转换为方便的整数格式。 特别是因为问题被标记为 SQL Server 2005
这也可以轻松扩展以处理二级和三级排序,
我使用乘法器再次简化实际的 select 语句并减少 ORDER BY 中 RBAR 评估的机会
You can simplify the CASE by using ROW_NUMBER which sorts your data and effectively converts it into a handy integer format. Especially since the question is tagged SQL Server 2005
This also expands easily enough to deal with secondary and tertiary sorts
I've used multiplier to again simplify the actual select statement and reduce the chance of RBAR evaluation in the ORDER BY
这对我来说效果很好 - (
where
,order by
,direction
,Pagination
)This works fine for me – (
where
,order by
,direction
,Pagination
)这是一个示例:
从这里:
http://www.domincpettifer.co.uk/Blog/21/dynamic-conditional-order-by-clause-in-sql-server-t-sql
Here is an example:
From here:
http://www.dominicpettifer.co.uk/Blog/21/dynamic-conditional-order-by-clause-in-sql-server-t-sql
已接受的答案的更紧凑版本,但作为已接受的答案,仅当
THEN 具有相同的类型。
More compact version of accepted answer, but as accepted answer this works fine only when result expressions after
THEN
have the same type.无论数据类型如何,都按 ASC 或 DESC 顺序动态排序。
第一个示例按字母顺序排序,第二个示例使用数字排序。 @direction 变量表示排序方向(0 = ASC 或 1 = DESC),[column] 是排序列。
这也适用于多列排序,如果放置在进一步的外部查询中,您可以隐藏 [row] 列。
Dynamic sorting in either ASC or DESC order, irrespective of datatype.
The first example sorts alphabetically, the second using numbers. The @direction variable denotes sort direction (0 = ASC or 1 = DESC) and [column] is the sort column.
This also works for multi-column sorting and you can hide the [row] column if placed in a further outer query.