从两个查询中选择选择不为空

时间:2017-09-27 17:02:32

标签: sql oracle null subquery

我有查询结果是单个值有很多情况下我带来一个空值,这是我不需要的所以我需要再做一个查询来给我带回一个值,所以我需要做一个一个查询在第一个查询中为null值时返回,省略结果并执行第二个查询。

第一个查询是

SELECT DISTINCT
           FIRST_VALUE (pac1.pac_name)
              OVER (ORDER BY pac1.pac_final_date DESC)
      FROM    matricula mac
           INNER JOIN
              periodo pac1
           ON mac.pac_id = pac1.pac_id
     WHERE mac.ent_id = 26172 AND mac.mac_estado IN (8072, 10221) 

第二个查询是

SELECT DISTINCT
              FIRST_VALUE (pac1.pac_name)
                 OVER (ORDER BY pac1.pac_final_date DESC)
         FROM  registro rea
              INNER JOIN
                 periodo pac1
              ON rea.pac_id = pac1.pac_id
        WHERE rea.ent_id = 26172

这两个查询带回了相同的值,但首先我需要咨询第一个查询,有两种情况。

case -1 - >当执行查询#1并将结果带给我时

结果

FIRST_VALUE (pac1.pac_name)
--------------------------
|Oct/2012 - Feb/2013     |
-------------------------- 

案例-2 - >当执行查询#1时,结果为null,然后执行一个确保为我带来值的查询#2

结果

FIRST_VALUE (pac1.pac_name)
--------------------------
|Oct/2012 - Feb/2013     |
-------------------------- 

这可能是一个简单的问题,但任何帮助都表示赞赏。

1 个答案:

答案 0 :(得分:0)

SELECT COALESCE(

    (SELECT DISTINCT
            FIRST_VALUE (pac1.pac_name)
               OVER (ORDER BY pac1.pac_final_date DESC)
        FROM    matricula mac
            INNER JOIN
               periodo pac1
            ON mac.pac_id = pac1.pac_id
        WHERE mac.ent_id = 26172 AND mac.mac_estado IN (8072, 10221) )

    ,(SELECT DISTINCT
              FIRST_VALUE (pac1.pac_name)
                 OVER (ORDER BY pac1.pac_final_date DESC)
         FROM  registro rea
              INNER JOIN
                 periodo pac1
              ON rea.pac_id = pac1.pac_id
        WHERE rea.ent_id = 26172))

如果没有测试数据和其他一些东西,我不是肯定的,但你也可以使用periodio作为主表,然后LEFT OUTER JOIN到其他2个表。使用案例表达式来确定您的订单中首先使用哪些表/行。也可以考虑使用与EXISTS类似的方法:

SELECT DISTINCT FIRST_VALUE(pac1.pac_name) OVER (ORDER BY
    CASE WHEN mac.pac_id IS NOT NULL THEN 0 ELSE 1 END, pac1.pac_final_date DESC)
FROM
    periodo pac1
    LEFT JOIN matricula mac
    ON pac1.pac_id = mac.pac_id
    AND mac.ent_id = 26172
    AND mac.mac_estado IN (8072, 10221)
    LEFT JOIN registro rea
    ON pac1.pac_id = rea.pac_id
    AND rea.ent_id = 26172