Oracle / SQL - 查找包含一个值的记录,不包括空值

时间:2015-03-21 09:02:05

标签: sql oracle

我有一个问题与另一个问题非常相似,但我无法弄明白。以下是原始问题的链接:Oracle/SQL - Finding records with one value excluding by similar record

与那个问题类似,我的记录要么是1,要么是null。相同的记录可以是1或null的组合,在这些情况下,我想完全排除记录。例如:

    Person  Type
    --------------
    Bob     1
    Sue     1
    Bob     null
    Tom     1
    Frank   1
    Frank   null
    Fred    null

我希望返回以下内容:

    Person  Type
    --------------
    Sue     1
    Tom     1

对此的任何指示都将非常感激。我没有太多时间来解决这个问题,所以即使在概念上讲也会有所帮助!

我最近的是

    select person from table
    where type = 'S'
    MINUS
    select person from table
    where type is null

但当然不起作用。

如果这是唯一的方法,我可以写一个函数。谢谢!

3 个答案:

答案 0 :(得分:2)

试试这个:

select person, type from table
where type = '1'
and person not in (select person from table where type is null)

答案 1 :(得分:2)

除了Mark的NOT IN方法,这也可以写成NOT EXISTS条件:

select p1.person
from person p1
where p1.type = 1
and not exists (select 1 
                from person p2
                where p1.person = p2.person
                and p2.type is null)
order by p1.person;

它基本上是这样说的:给我每个类型为1的人,但是对于这个类型为null的人没有其他行。

SQLFiddle示例:http://sqlfiddle.com/#!4/7623c/4

答案 2 :(得分:1)

您可以使用分析功能轻松完成此操作,这些功能通常可以提供非常好的性能:

select p.*
from (select p.*,
             sum(case when type is null then 1 else 0 end) over (partition by person) as Nullcnt
      from person p
     ) p
where nullcnt = 0;