如何在 WHERE 子句中使用别名?

How to use aliases in WHERE clause?

简单问题:如何在SELECT语句后使用别名?假设我有这样的查询:

SELECT salary/12 AS sal 
FROM sdatabase
WHERE sal > 1000

当然不行,因为数据库会报错。我知道我可以像这样用 salary/12 替换 sal

WHERE salary/12 > 1000

但我认为它的可读性较差。那么有什么我可以用它做的吗?或者这就是它完成的方式?

将原始查询包装为 派生的 table(子查询):

select *
from
(
    SELECT salary/12 AS sal
    FROM sdatabase
) dt
WHERE sal > 1000

从时间顺序的角度来看,您的别名在 "WHERE" 中不可用,因此您需要一个子查询来实现此...

SELECT * FROM 
( SELECT salary/12 AS sal FROM sdatabase ) 
sq WHERE sal > 1000

从逻辑上讲,WHERE 子句在 SELECT 之前计算。这就是您不能在 WHERE 中使用列 sal 的原因。它不像其他语言那样从上到下执行代码。简化的顺序如下所示:

  1. 来自
  2. 加入
  3. 哪里
  4. 分组依据
  5. 拥有
  6. SELECT
  7. 不同
  8. 订购方式

您可以通过在浏览器中输入 logical query processing 找到更多相关信息。

您可以试试通用 Table 表达式 (CTE) -

WITH cte AS
(SELECT salary/12 AS sal 
FROM sdatabase
WHERE sal > 1000)

SELECT * 
FROM cte
WHERE sal > 1000

如果您正在学习如何在 WHERE 语句中使用别名,那么@Jarlh 的解决方案很好,但实际上,直接使用如下过滤条件更有意义。这排除了使用具有相同结果的 sub-query。

SELECT salary/12 AS sal 
FROM sdatabase
WHERE salary > 12000