条件ORDER BY不适用于临时表

时间:2017-04-14 17:42:19

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

对于以下简化的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

为什么我会收到错误:

  

无效的列名称“价格”。

是否可以对计算列进行排序?

请注意,我的实际问题是一个更复杂的查询的一部分,但是这个简化的示例确实证明了问题并且会引发错误。

1 个答案:

答案 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子句中较早出现的所有表中的列。