2011-12-20 71 views
2

使用别名我有一个(SQL Server 2008中)查询,如下所示:SQL:为了case语句

Select *, column1+column2 as alias1 
From complaints 
Order by 
Case 
    When @param1 = 'filedate' then filedate 
    When @param1 = 'calc' then alias1 
End 

这是不行的,因为订购在一个case语句的别名是不允许的,它不识别别名1。

有没有另一种方法可以做到这一点?

感谢

回答

3

无论是把它放在一个CTE,然后ORDER BY ...

; with cteQuery as (Select *, column1+column2 as alias1 from complaints) 
SELECT * from cteQuery Order by 
Case 
    When @param1 = 'filedate' then filedate 
    When @param1 = 'calc' then alias1 
End 

或只是复制别名实际引用的内容...

Select *, column1+column2 as alias1 
From complaints 
Order by 
Case 
    When @param1 = 'filedate' then filedate 
    When @param1 = 'calc' then column1+column2 
End 
+0

欢迎来到StackOverflow:如果您发布代码,XML或数据样本,请**在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码样本”按钮(“{}”)以精确地设置格式语法突出它! –

+0

谢谢,我喜欢CTE的接近。我会尝试! –

+0

它的工作,再次感谢! –

3

简单的答案:

Select complaints.*, column1+column2 as alias1 
From complaints 
Order by 
Case 
    When @param1 = 'filedate' then filedate 
    When @param1 = 'calc' then column1+column2 
End 
+0

谢谢!在我的情况下,表达式很复杂,所以这可能会对性能产生影响?我也不喜欢重复... –

+1

我不知道性能,虽然通常磁盘访问是比查询性能计算更大的因素。 Stuart的第二个查询和Andrew的第一个(基于CTE的)查询中的子查询方法整齐地删除了重复。 –

2
Select *, column1+column2 as alias1 
From complaints 
Order by Case 
    When @param1 = 'filedate' then filedate 
    When @param1 = 'calc' then column1+column2 
    End 

OR

SELECT * 
FROM ( Select *, column1+column2 as alias1 
    From complaints) c 
    Order by Case 
     When @param1 = 'filedate' then filedate 
     When @param1 = 'calc' then alias1 
     End 
+0

谢谢!在我的实际情况中,这是一个包含地理位置的复杂公式。第一个解决方案是否会成为性能问题?看来第二个解决方案可能会解决我的问题!我会试试这个,让你知道。 –