条件 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 的列。
对于以下简化的 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 的列。