2010-10-07 104 views
12

在MS SQL Server 2008 R2中编写存储过程,我想避免使用DSQL ...条件SQL ORDER BY ASC/DESC为阿尔法列

我想排序法(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 

我不知道,如果强制排序上均匀柱比从排序字符串获得数字虽然

回答

27

一种选择

;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 
+0

聪明,非常类似于我的解决方案我张贴的编辑。我希望得到比导出数据的另一个排序副本更有效率的东西,以产生一个数字排序顺序.... – Matthew 2010-10-07 19:00:40

+0

@Matthew PK:你必须用字符串代替匹配的数字,或者为非相关案件。没有*真的*聪明我很害怕 – gbn 2010-10-07 19:04:21

+0

您如何看待我的第二次编辑中的“两个ORDER BY子句”方法? – Matthew 2010-10-07 19:32:34

1

这是其中一种情况下,当特定的解决方案可能是最好的可以用通用的,特别是当我们处理大量的数据时。我想:

IF @OrderAscOrDesc = 0 THEN BEGIN 
    SELECT ... 
    FROM ... 
    ORDER BY [AlphaColumn] ASC 
END ELSE BEGIN 
    SELECT ... 
    FROM ... 
    ORDER BY [AlphaColumn] DESC 
END 

如果您对[AlphaColumn]索引,你有时可能会获得更好的计划,更具体的查询,比通用一个尺寸适合所有人的一个。

编辑:方便代码重用,你可以用你的内联UDF选择 - 它会执行一样好:

IF @OrderAscOrDesc = 0 THEN BEGIN 
    SELECT ... 
    FROM YourInlineUdf(...) 
    ORDER BY [AlphaColumn] ASC 
END ELSE BEGIN 
    SELECT ... 
    FROM YourInlineUdf(...) 
    ORDER BY [AlphaColumn] DESC 
END 
+0

我同意你的原则,已经提出。在我的特定应用程序中,我不希望这样做,因为查询相对较长并且使用多个连接。我的担心是代码重复6次左右,这使得维护和未来更新变得困难。 – Matthew 2010-10-07 21:00:21

+0

@Matthew PK:为了便于代码重用,你可以将你的选择包装在内联UDF中 - 它的表现也会一样 – 2010-10-07 21:35:21