Oracle:如果存在非空值,则为Union列

时间:2014-01-30 11:43:47

标签: sql oracle

我一直在尝试,但无法找到正确的方法。

我的查询如下:

select name, value from table1
union select name, value from table2

目前我的查询返回以下内容:

Name  | Value
-------------  
Name1 | null
Name1 | value1
Name1 | value2
Name2 | null

上述结果中的空值仅来自table1,我想仅在相应名称没有非空值时才返回空值,例如:

Name  | Value
-------------  
Name1 | value1
Name1 | value2
Name2 | null

有关如何执行此查询的任何建议?

3 个答案:

答案 0 :(得分:2)

比目前为止的答案(IMO)更简单的方法是明确地从存在非空值的名称的结果中排除空值。它可以写成

with unioncte as (
select name, value from table1
union
select name, value from table2
)
select name, value from unioncte
minus
select name, null from unioncte
where value is not null;

答案 1 :(得分:0)

您还可以使用分析函数来计算名称和过滤器的NULL值的数量:

with v_data as (
  select name, value from table1
  union
  select name, value from table2
)
select v2.* from (
  select 
    v1.*, 
    count(value) over (partition by name) as value_cnt
  from v_data v1
) v2 where value_cnt = 0 or value is not null

答案 2 :(得分:-1)

您可以使用where

SELECT *
  FROM (
        SELECT name, value 
          FROM table1
         UNION 
        SELECt name, value 
          FROM table2
       ) s1
 WHERE s1.value IS NOT NULL
    OR s1.name NOT IN (
                      SELECT name
                        FROM table1
                       WHERE value IS NOT NULL
                       UNION
                      SELECT name
                        FROM table2
                       WHERE value IS NOT NULL
                  )