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);
我正在寻找能够解决以下问题的最简单的解决方案。 我有一个 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);