对不起,如果这是重复的,但我还没有找到一个。为什么当我使用CASE
时,我无法使用从ORDER BY
中定义的SELECT
中的列别名?为什么我不能使用CASE在ORDER BY中引用列别名?
考虑一个简单的查询:
SELECT NewValue=CASE WHEN Value IS NULL THEN '<Null-Value>' ELSE Value END
FROM dbo.TableA
ORDER BY CASE WHEN NewValue='<Null-Value>' THEN 1 ELSE 0 END
结果是错误的:
Invalid column name 'NewValue'
Here's a sql-fiddle.(更换ORDER BY NewValue
与CASE WHEN...
that'注释掉了)
我知道在这种情况下,我可以使用ORDER BY CASE WHEN Value IS NULL THEN 1 ELSE 0 END
,如here,但实际上查询更复杂,而我尽可能保持可读性。我是否必须使用子查询或CTE,如果是的话为什么会这样?
更新作为的Mikael埃里克森评论用别名在组合的任何表达是不允许的。所以即使这个(没有意义的查询)出于同样的原因失败:
SELECT '' As Empty
FROM dbo.TableA
ORDER BY Empty + ''
结果:
Invalid column name 'Empty'.
所以别名被允许在ORDER BY
也是一种表达,但不能同时。为什么,这难以执行?因为我主要是程序员,所以我把别名看作可以简单地用在表达式中的变量。
在此语句排序由“测试”。“COL_1”你为什么不换行外的情况下,条件通过施加磁场和秩序? – 2014-09-10 11:17:09
@AndyKorneyev:我也知道解决方法,但我想知道为什么这是不允许的。这似乎是相当普遍的,一个别名应该隐藏复杂性,所以为什么我不允许这样做,如果我通常可以在'ORDER BY'中使用别名? – 2014-09-10 11:18:18
这里有一个很长的讨论(可能有点过时):http://social.msdn.microsoft.com/Forums/sqlserver/en-US/4ad14cad-1e61-43a0-96f8-70a506106a00/column-alias-usage --everywhere-in-a-query-following-definition?forum = transactsql – davek 2014-09-10 11:23:20