问题
在结果集中,你已经使用别名更改列名,但还想使用 WHERE 子句将某些行排除在外。为此,你在 WHERE 子句中引用了别名,但以失败告终。
select job, salary as sal
from emp
where sal<=3000;
解决方案
将查询作为内嵌视图来引用列的别名。
select job, sal
from (select job, salary as sal
from emp) a
where sal <= 3000;
扩展
在这个简单的实例中,可以在 WHERE 子句中直接引用 salary,这样就无须使用内嵌视图了。
select job, salary as sal
from emp
where salary <= 3000;
上述解决方案演示了在 WHERE 子句中引用如下内容时,需要做什么。
- 聚合函数
- 标量子查询
- 窗口函数
- 别名
补充
将提供别名的查询放在内嵌视图中,就可以在外部查询中引用列的别名。为什么要这样做呢?
这是由于 WHERE 子句是在 SELECT 子句之前评估的,
因此,对于前面说明问题时列举的查询,在评估其中的 WHERE 子句时,还没有别名 SAL。
这些别名在 WHERE 子句处理完毕后才存在。然而,FROM 子句是在 WHERE 子句之前评估的。
如果将查询放在 FROM 子句中,那么将在最外层的 WHERE 子句执行前生成该查询的结果,这样一来,最外层的 WHERE 子句就能够“看到”别名了。在列名不是太好时,这种技巧很有用。
点个赞吧,这对我非常重要!