我正在尝试创建一个执行以下操作的SQL查询:
SELECT
CASE
WHEN a + b IS NULL a
ELSE b
END AS derived,
c / derived as new1,
sum(derived + d) as new2
FROM mytable
JOIN ...
WHERE ...;
然而,我遇到的问题是它无法在SELECT
中实际引用先前的别名。在SQL中解决这个问题的惯用方法是什么?
答案 0 :(得分:0)
唉,据我所知,对于任何数据库,别名都不能在它们被定义的[martin@bonnie ~]$ anaconda2/bin/conda install -c pingucarsti grib_api=1.10.4
Fetching package metadata .........
Solving package specifications: ..........
Package plan for installation in environment /home/martin/anaconda2:
The following packages will be downloaded:
package | build
---------------------------|-----------------
grib_api-1.10.4 | 3 1.7 MB pingucarsti
The following NEW packages will be INSTALLED:
grib_api: 1.10.4-3 pingucarsti
Proceed ([y]/n)? y
Fetching packages ...
grib_api-1.10. 100% |################################| Time: 0:00:01 1.24 MB/s
Extracting packages ...
[ COMPLETE ]|###################################################| 100%
Linking packages ...
[ COMPLETE ]|###################################################| 100%
语句中重用。因此,如果您在同一SELECT
语句中需要它,我认为您必须简单地重复CASE
表达式的逻辑。
如果你想避免这种情况,你可以使用普通的SQL技术做的最好的事情就是查询定义SELECT
列的查询并以这种方式重用它,例如。
derived
答案 1 :(得分:0)
只需放置一个外部选择块就可以了。见下文:
with abc as (select derived,
c / derived as new1,
sum(derived + d) as new2
from
(SELECT
CASE
WHEN a + b IS NULL then a
ELSE b
END AS derived,
c,
d
FROM mytable ) )
select a.*,<column list>
from abc a
join ...
WHERE ....;
答案 2 :(得分:0)
我经常将此类计算移动到最后一次JOIN后附加的CROSS APPLY。然后,派生列可用于SELECT,GROUP BY和ORDER BY。
3.10.3