在我的程序中,我有:
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
,但它也无法正常工作。
答案 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但它也不起作用。
如果您的列类型(Col1
和Col2
)为varchar
,您应该可以使用CONCAT()
:
...
ORDER BY
CASE WHEN @SortColumn='Col1' THEN Col1 END ASC,
CASE WHEN @SortColumn='Col3' THEN CONCAT(Col1,Col2) END ASC
在其他情况下,您可以使用CONVERT()
函数将列转换为字符串,然后连接。