Oracle 函数根据其他列区分 NULL 值

Oracle function to distinct NULL values based on other column

我正在寻找能够解决以下问题的最简单的解决方案。 我有一个 table:

Column1           Column2
-------           -------
A                 11
A                 NULL
B                 12
B                 14
B                 NULL
C                 NULL

我想查询 (Select) 这个 table 以仅获得 NULL 值,因为这是 column1 的唯一值。当 column1 至少有一个非空值时,绕过它们的 null 值很重要。期望的结果:

Column1           Column2
-------           -------
A                 11
B                 12
B                 14
C                 NULL

我尝试使用 COALESCE、NULLIF 等,但没有结果。我想用最简单的解决方案来实现这一目标。然后我将 Column2 与其他 table 中的列一起加入,但是对于 NULL,我希望左连接是合适的。

非常感谢任何帮助

应该像这样工作(虽然可能有更高效的方法)

select column1, column2 
  from table where column2 is not null
union
( select column1, column2 
  from table 
  where column2 is null
    and column1 not in ( select column1
                           from table
                          where column2 is not null 
                          group by column1)
)

联合上方的第一个 select 获取所有没有 null 值的行,然后第二个简单地添加 column2 中具有 null 值的所有行,但不是你拥有的那些已经是第一个了。 group by 对结果来说不是必需的,但可能会理清逻辑。

您可以使用左连接,首先从 table 中获取您需要的值,然后将其连接到自身。

为清楚起见,此处显示为 CTE。

WITH Col1Values AS
(
   SELECT DISTINCT Column1           
   FROM Table
)
SELECT Col1Values.Column1, T2.Column2
FROM Col1Values 
LEFT JOIN Table T2 ON Col1Values.Column1 = T2.Column1

或使用子查询

SELECT T1.Column1, T2.Column2
FROM (
   SELECT DISTINCT Column1           
   FROM Table
) T1
LEFT JOIN Table T2 ON T1.Column1 = T2.Column1

试试这个:

SELECT column1, column2 
  FROM dummy t1
 WHERE column2 IS NOT NULL 
       OR NOT EXISTS (SELECT '' 
                        FROM dummy t2 
                       WHERE t1.column1 = t2.column1 
                         AND column2 IS NOT NULL)

保留 column2 不为 NULL 或为 NULL 并且是组中唯一的所有行。

内部查询:使用解析函数计算每个C1有多少个非空C2值 外部查询:过滤具有非空 C2 或 count-distinct-C2=0

的行
SELECT C1, C2
FROM (
        SELECT C1, C2, COUNT(C2) OVER (PARTITION BY C1) C2_COUNT
        FROM TABLE
    ) 
WHERE C2 IS NOT NULL OR C2_COUNT = 0;

加入相同解决方案的版本(无分析功能)

SELECT  C1, C2 
FROM    TABLE 
        NATURAL INNER JOIN
        (SELECT C1, COUNT(C2) C2_COUNT 
         FROM TABLE GROUP BY C1)
WHERE   C2 IS NOT NULL OR C2_COUNT = 0;

试试这个

 select c1, c2 from t where c2 in (select distinct c2 from t where c2 is not null);