在SQL中重用条件选择

时间:2016-09-30 08:55:46

标签: sql

我正在尝试创建一个执行以下操作的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中解决这个问题的惯用方法是什么?

3 个答案:

答案 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