从Oracle中的两个表返回非空值

时间:2014-11-06 11:28:31

标签: oracle

我有两个表,T1T2具有相同的列集。我需要发出一个查询,它将从任何一个表中返回列的值,以非空为准。如果两列都为null,则返回null作为该列的值。

列为c1c2,c3,cond1。

我发出了以下查询。问题是如果一个子查询失败,整个查询将失败。有人请帮帮我。可能还有另一种简单的方法。

SELECT NVL(T1.c1, T2.c1) c1,NVL(T1.c2, T2.c2) c2,NVL(T1.c3, T2.c3) c3
FROM   (SELECT c1,c2,c3
        FROM   T1
        WHERE  cond1 = 'T10') T1
      ,(SELECT c1,c2,c3
        FROM   T2
        WHERE  cond1 = 'T200') T2 ;

1 个答案:

答案 0 :(得分:0)

你需要这样的东西:

SELECT NVL((SELECT T1.c1
              FROM T1
             WHERE T1.c2 = 'T10'),
           (SELECT T2.c1
              FROM T2
             WHERE T2.c2 = 'T200')) AS c1
FROM dual

或者您可能更喜欢full outer join

    SELECT NVL(T1.c1, T2.c1) AS c1
          FROM T1      FULL OUTER JOIN T2 ON 1=1
         WHERE T1.c2 = 'T10'
           AND T2.c2 = 'T200'

您的结果是合乎逻辑的。如果第一个表为null,则natural join中不存在任何值组合。

修改即可。在一些新要求之后,我们可以使用hack来获取行。让我们获得所有三种可能性,T1,T2或所有空值并选择第一个:

SELECT *
  FROM ( (SELECT T1.*
            FROM T1
           WHERE T1.c2 = 'T10')
      UNION ALL  
         (SELECT T2.*
            FROM T2
           WHERE T2.c2 = 'T200')
      UNION ALL
         (SELECT T2.*
            FROM dual 
       LEFT JOIN T1 ON 1 = 0 ) )
  WHERE ROWNUM = 1