我一直在尝试,但无法找到正确的方法。
我的查询如下:
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
有关如何执行此查询的任何建议?
答案 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
)