如何在选择期间优先考虑空值
Posted
技术标签:
【中文标题】如何在选择期间优先考虑空值【英文标题】:How to to give preference to null value during select 【发布时间】:2020-02-09 03:56:18 【问题描述】:我有一张桌子
Id value
1000 null
1000 En
1000 Fr
1000 Es
1001 En
1001 Fr
1001 Es
选择查询的输出应如下所示。 (由于1000只有空值,所以选择空值的行)
Id value
1000 null
1001 En
1001 Fr
1001 Es
【问题讨论】:
请停止删除我编辑的格式。要么自己格式化,要么保留更改。 【参考方案1】:您可以使用NOT EXISTS
和相关子查询来检查ID 是否不存在NULL
。包括这些行以及value
为NULL
的行。
SELECT t1.id,
t1.value
FROM elbat t1
WHERE NOT EXISTS (SELECT *
FROM elbat t2
WHERE t2.id = t1.id
AND t2.value IS NULL)
OR t1.value IS NULL;
【讨论】:
【参考方案2】:with
t (id, value) as (
select 1000, null from dual union all
select 1000, 'En' from dual union all
select 1000, 'Fr' from dual union all
select 1000, 'Es' from dual union all
select 1001, 'En' from dual union all
select 1001, 'Fr' from dual union all
select 1001, 'Es' from dual
)
select id, value
from (
select t.*,
dense_rank() over (partition by id order by nvl2(value, 1, 0)) rnk
from t
)
where rnk = 1
;
ID VA
---------- --
1000
1001 En
1001 Fr
1001 Es
此查询中使用的函数:
NVL2()
https://docs.oracle.com/database/121/SQLRF/functions132.htm#SQLRF00685
DENSE_RANK()
https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions043.htm
【讨论】:
【参考方案3】:在最新版本的 Oracle 中,您实际上可以在没有子查询的情况下执行此操作:
select t.*
from t
order by rank() over (partition by id order by (case when value is null then 1 else 2 end))
fetch first 1 row with ties;
Here 是一个 dbfiddle。
【讨论】:
e x c e l l e n t.【参考方案4】:您可以使用analytical function
,如下:
Select id , value from
(Select t.*,
Coalesce(Sum(case when value is null then 1 end) over (partition by id), 0) as cnt
From your_table)
Where (cnt = 1 and value is null)
or cnt = 0
干杯!!
【讨论】:
以上是关于如何在选择期间优先考虑空值的主要内容,如果未能解决你的问题,请参考以下文章