按案例排序 - 按动态列排序

时间:2017-09-18 10:17:01

标签: sql sql-server tsql sql-order-by

在我的程序中,我有:

SELECT
    Col1,
    Col2,
    (Col1+ Col2) AS Col3
FROM Table1
ORDER BY 
    CASE WHEN @SortColumn='Col1' THEN Col1 END ASC,
    CASE WHEN @SortColumn='Col3' THEN Col3 END ASC -- PROBLEM HERE

问题在于,我无法按Table1中不存在的列进行排序。我尝试使用CASE WHEN @SortColumn='Col3' THEN 'Col3' END ASC,但它也无法正常工作。

3 个答案:

答案 0 :(得分:4)

使用CTE或子查询:

with t as (
      select col1, col2, (col1 + col2) as col3
      . . .
     )
select t.*
from t
order by (case when @SortColumn = 'Col1' then col1 end) asc,
         (case when @SortColumn = 'Col2' then col2 end) asc;

答案 1 :(得分:2)

另一个sql-server选项是CROSS APPLY

SELECT
    Col1,
    Col2,
    ca.Col3
FROM Table1
CROSS APPLY( 
      SELECT (Col1 + Col2) AS Col3
) ca
ORDER BY 
    CASE WHEN @SortColumn='Col1' THEN Col1 END ASC,
    CASE WHEN @SortColumn='Col3' THEN ca.Col3 END ASC

答案 2 :(得分:0)

  

问题是我不能按Table1中不存在的列排序。我尝试使用CASE WHEN @ SortColumn ='Col3'THEN'Col3'END ASC但它也不起作用。

如果您的列类型(Col1Col2)为varchar,您应该可以使用CONCAT()

...
ORDER BY 
    CASE WHEN @SortColumn='Col1' THEN Col1 END ASC,
    CASE WHEN @SortColumn='Col3' THEN CONCAT(Col1,Col2) END ASC

在其他情况下,您可以使用CONVERT()函数将列转换为字符串,然后连接。