如何在 WHERE 子句中使用临时列的名称?

问题描述

首先,我不得不说我在来到这里之前研究了我的问题,看到了类似的 question here 及其所有答案,但不幸的是它并没有帮助我。

Oracle sql

我有

SELECT 
    first_name,salary_dollars,0.85 * salary_dollars AS salary_euro
FROM 
    employees 
WHERE 
    0.85 * salary_dollars > 4000;

其中 salary_euro 是我的临时专栏。我想避免在 WHERE 子句中进行双重计算,但如果我在请求中写入 WHERE salary_euro > 4000,则会出现此错误

ORA-00904:“SALARY_EURO”:标识符无效
00904. 00000 - "%s: 无效标识符"
*原因:
*行动:
错误:6 列:7

解决方法

解决此限制的一种方法是使用子查询来创建临时列:

SELECT * 
FROM   (SELECT first_name,salary_dollars,0.85 * salary_dollars AS salary_euro
       FROM    employees) e
WHERE  salary_euro > 4000;
,

Oracle 现在支持横向连接。这允许您将定义移动到 FROM 子句:

SELECT e.first_name,e.salary_dollars,x.salary_euro    
FROM employees e CROSS JOIN LATERAL
     (SELECT 0.85 * e.salary_dollars AS salary_euro FROM DUAL
     ) x
WHERE x.salary_euro > 4000;

横向连接使定义计算链变得更简单,因为下一个表达式可以依赖于前一个表达式。

当然,使用 CTE 或子查询的传统方法也非常可行。