如何在选择期间优先考虑空值

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。包括这些行以及valueNULL 的行。

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

干杯!!

【讨论】:

以上是关于如何在选择期间优先考虑空值的主要内容,如果未能解决你的问题,请参考以下文章

按 2 列对表进行分组并优先考虑非空值?

想入行大数据,面对开发语言和分析软件时,该如何选择?

如何选择线程的优先级?

如何在 sqlite 中选择带有空值的尾部?

如何通知 cmake 优先考虑某个文件

如何在线程中优先考虑用户定义的消息?