对于以下简化的T-SQL语句
DECLARE @SortColumn nvarchar(50)
SET @SortColumn = 'Price'
SELECT Name, 1+1 as Price
INTO #MyTempTable
FROM Events
ORDER BY
CASE
WHEN @SortColumn = 'Name' THEN Name
END,
CASE
WHEN @SortColumn = 'Price' THEN Price
END DESC
为什么我会收到错误:
无效的列名称“价格”。
是否可以对计算列进行排序?
请注意,我的实际问题是一个更复杂的查询的一部分,但是这个简化的示例确实证明了问题并且会引发错误。
答案 0 :(得分:1)
您可以order by
计算字段。您不能在order by
中包含表达式这样的字段。这是一个解决方法:
SELECT e.Name, v.Price
INTO #MyTempTable
FROM Events e OUTER APPLY
(VALUES (1 + 1)) v(price)
ORDER BY (CASE WHEN @SortColumn = 'Name' THEN e.Name END),
(CASE WHEN @SortColumn = 'Price' THEN v.Price END DESC);
也就是说,您可以使用OUTER APPLY
定义表达式。然后可以使用结果,就好像它是表中的列一样。
定义表达式基本没有限制。 In可以包含FROM
子句中较早出现的所有表中的列。