条件 ORDER BY 不适用于临时 table

Conditional ORDER BY not working for temp table

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

为什么会出现错误:

Invalid column name 'Price'.

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

请注意,我的实际问题是一个复杂得多的查询的一部分,但这个简化的示例确实演示了该问题并将引发错误。

您可以order by计算域。您不能在 order by 中包含 expression 这样的字段。这是一种解决方法:

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定义表达式。然后可以使用结果,就好像它是 table.

中的一列一样

定义表达式基本没有限制。 In 可以包含 FROM 子句中较早出现的所有 table 的列。