0

我有这个查询:

Select (Country.Name + ', ' + City.Name) as Location
...
Where Location like '%Punta Cana%'

由于它在没有“位置”的情况下工作,我天真地认为它可以工作。好吧,它不会并引发错误:无效的列名“位置”。有没有人有时间请解释为什么它不起作用以及可行的替代方案是什么?

4

4 回答 4

4

不,您不能在查询中的其他任何地方引用列别名,除了ORDER BY. 这是因为 SQL Server 对查询中的子句进行逻辑解析的方式——SELECT倒数第二。(在 dba.SE 上有很多有趣的讨论。)

您的选择是重复表达式或使用子查询/CTE。已经有子查询/ CTE的例子,所以为了完整起见,你也可以这样做:

Select (Country.Name + ', ' + City.Name) as Location
...
Where (Country.Name + ', ' + City.Name) like '%Punta Cana%'

我昨天刚刚回答了同样的问题,包括证明重复表达并不像听起来那么昂贵:

WHERE 子句中的引用别名(在 SELECT 中计算)

于 2012-06-26T13:45:28.070 回答
3

请改用此方法:

; with temp as (
Select (Country.Name + ', ' + City.Name) as Location
...
)
select * from temp
Where Location like '%Punta Cana%'
于 2012-06-26T13:41:31.967 回答
1

如果要在中使用别名,ORDER BY可以将整个SELECT内部包装在另一个中SELECT

SELECT *
FROM 
(
    Select (Country.Name + ', ' + City.Name) as Location
    ...
) x
Where x.Location like '%Punta Cana%'

ORDER BY否则,您将不得不在子句中再次使用该表达式

于 2012-06-26T13:47:29.467 回答
0

位置不是列名。它只是您正在创建的别名。

于 2012-06-26T13:42:23.333 回答