在MS SQL Server 2008 R2中编写存储过程,我想避免使用DSQL ...
我希望sort方法(ASC或DESC)是有条件的。
现在,使用数字列,我只需使用case语句并取消值来模拟ASC或DESC ...... 那就是:
... ORDER BY CASE @OrderAscOrDesc WHEN 0 THEN [NumericColumn] ELSE -[NumericColumn] END ASC
使用alpha列执行此操作的适当方法是什么?
编辑:我想到了一个聪明的方法,但它看起来非常低效...我可以将我的有序alpha列插入带有自动编号的临时表中,然后使用上述方法按自动编号排序。EDIT2:
你们怎么看待这种方法?
ORDER BY CASE @OrderAscOrDesc WHEN 0 THEN [AlphaColumn] ELSE '' END ASC,
CASE @OrderAscOrDesc WHEN 0 THEN '' ELSE [AlphaColumn] END DESC
我不知道是否强制对统一列进行排序比从排序字符串中导出数字更有效
答案 0 :(得分:30)
一个选项
;WITH cQuery AS
(
SELECT
*,
ROW_NUMBER() OVER (ORDER BY SortColumn) AS RowNum
FROM
MyTable
)
SELECT
*
FROM
cQuery
ORDER BY
RowNum * @Direction --1 = ASC or -1 = DESC
或者说恕我直言的有点丑陋
ORDER BY
CASE WHEN 'ASC' THEN SortColumn ELSE '' END ASC,
CASE WHEN 'DESC' THEN SortColumn ELSE '' END DESC
答案 1 :(得分:1)
这是特定解决方案可能优于通用解决方案的情况之一,尤其是当我们处理大量数据时。我会:
IF @OrderAscOrDesc = 0 THEN BEGIN
SELECT ...
FROM ...
ORDER BY [AlphaColumn] ASC
END ELSE BEGIN
SELECT ...
FROM ...
ORDER BY [AlphaColumn] DESC
END
如果你在[AlphaColumn]上有一个索引,你有时可能会得到一个更具体的查询,而不是通用的一刀切。
编辑:为了方便代码重用,您可以将select包装在内联UDF中 - 它也可以执行:
IF @OrderAscOrDesc = 0 THEN BEGIN
SELECT ...
FROM YourInlineUdf(...)
ORDER BY [AlphaColumn] ASC
END ELSE BEGIN
SELECT ...
FROM YourInlineUdf(...)
ORDER BY [AlphaColumn] DESC
END