我有这个查询:
Select (Country.Name + ', ' + City.Name) as Location
...
Where Location like '%Punta Cana%'
由于它在没有“位置”的情况下工作,我天真地认为它可以工作。好吧,它不会并引发错误:无效的列名“位置”。有没有人有时间请解释为什么它不起作用以及可行的替代方案是什么?
我有这个查询:
Select (Country.Name + ', ' + City.Name) as Location
...
Where Location like '%Punta Cana%'
由于它在没有“位置”的情况下工作,我天真地认为它可以工作。好吧,它不会并引发错误:无效的列名“位置”。有没有人有时间请解释为什么它不起作用以及可行的替代方案是什么?
不,您不能在查询中的其他任何地方引用列别名,除了ORDER BY
. 这是因为 SQL Server 对查询中的子句进行逻辑解析的方式——SELECT
倒数第二。(在 dba.SE 上有很多有趣的讨论。)
您的选择是重复表达式或使用子查询/CTE。已经有子查询/ CTE的例子,所以为了完整起见,你也可以这样做:
Select (Country.Name + ', ' + City.Name) as Location
...
Where (Country.Name + ', ' + City.Name) like '%Punta Cana%'
我昨天刚刚回答了同样的问题,包括证明重复表达并不像听起来那么昂贵:
请改用此方法:
; with temp as (
Select (Country.Name + ', ' + City.Name) as Location
...
)
select * from temp
Where Location like '%Punta Cana%'
如果要在中使用别名,ORDER BY
可以将整个SELECT
内部包装在另一个中SELECT
SELECT *
FROM
(
Select (Country.Name + ', ' + City.Name) as Location
...
) x
Where x.Location like '%Punta Cana%'
ORDER BY
否则,您将不得不在子句中再次使用该表达式
位置不是列名。它只是您正在创建的别名。