如何在 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
的原因。它不像其他语言那样从上到下执行代码。简化的顺序如下所示:
- 来自
- 加入
- 哪里
- 分组依据
- 拥有
- SELECT
- 不同
- 订购方式
您可以通过在浏览器中输入 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
简单问题:如何在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
的原因。它不像其他语言那样从上到下执行代码。简化的顺序如下所示:
- 来自
- 加入
- 哪里
- 分组依据
- 拥有
- SELECT
- 不同
- 订购方式
您可以通过在浏览器中输入 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