不应该这个SQL查询(在组合列之后)工作吗?

时间:2012-06-26 13:40:08

标签: sql sql-server

我有这个问题:

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

因为它没有“我在哪里”,我天真地认为它可以正常工作。好吧,它没有并抛出错误:无效的列名称'位置'。有没有人有时间请解释为什么它不起作用,什么是可行的替代方案?

4 个答案:

答案 0 :(得分:4)

不,除了ORDER BY之外,您无法在查询中的任何其他位置引用列别名。这是因为SQL Server对查询中的子句进行逻辑解析的方式 - SELECT是倒数第二。 (Lots of interesting discussion about this over on dba.SE。)

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

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

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

Reference alias (calculated in SELECT) in WHERE clause

答案 1 :(得分:3)

请改用此方法:

; with temp as (
Select (Country.Name + ', ' + City.Name) as Location
...
)
select * from temp
Where Location like '%Punta Cana%'

答案 2 :(得分:1)

如果您想在ORDER BY中使用别名,可以将整个SELECT包裹在另一个SELECT

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

否则,您必须在ORDER BY子句

中再次使用该表达式

答案 3 :(得分:0)

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