2016-09-30 63 views
0

我试着去创建一个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 ...; 

但是有问题的IM是它seemes没有办法在实际引用早期别名SELECT。在SQL中解决这个问题的习惯用法是什么?

+3

这是oracle,mysql还是sql server? – mfredy

+0

使用派生的相同大小写表达式。所以,而不是衍生使用整个案例表达式,除了'AS派生' – Nebi

回答

0

据我所知,唉,别名在任何数据库的SELECT声明中都不可用于任何数据库。所以我认为如果你在同一个SELECT声明中需要它,你将不得不重复CASE表达式的逻辑。

如果您想避免这种情况,使用常规SQL技术可以做的最好的做法是子查询定义derived列的查询,并以此方式重用该查询。

SELECT t.derived, 
     t.c/t.derived  AS new1, 
     SUM(t.derived + t.d) AS new2 
FROM 
(
    SELECT CASE WHEN a + b IS NULL THEN a ELSE b END AS derived, 
      c, d 
    FROM mytable 
) t 
+0

我有多个连接,并在更新的示例中更好地显示。 – user3139545

+0

@ user3139545,无论如何,相同的派生表的想法将帮助你。 – jarlh

+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 ....; 
+0

我有多个连接,并在更新的示例中显示更好的位置。 – user3139545

+0

我使用结果作为CTE并进一步加入。检查更新 – XING

0

我经常把这样的计算移动到CROSS APPLY,在最后一个JOIN之后附加。派生列随后可用于SELECT,GROUP BY和ORDER BY。

SELECT 
    derived, 
    c/derived as new1, 
    sum(derived + d) as new2 
FROM mytable 
JOIN ... 
CROSS APPLY ( SELECT CASE 
         WHEN a + b IS NULL a 
         ELSE b 
         END AS derived 
      ) AS d(derived) 
WHERE ...; 
+0

我猜只会在Oracle 12c中执行。 CROSS APPLY是Oracle 12c的一项功能 – XING

+1

@XING:在SQL Server和Postgres(它使用SQL标准的'LATERAL',而不是'APPLY')支持CROSS APPLY –

+0

Ohh..i see ..然后它是有道理的数据库名称未正确标记 – XING