IS NULL或NOT IN以考虑计数中的空值

时间:2013-08-26 16:40:43

标签: sql oracle11g

当使用t.status is NULL运行以下查询时,它给出了不同的计数(我认为这是不正确的)。

如何通过NOT IN ('Cancelled', 'Duplicate')获取计数,但在计数中包含NULL个值

对于以下查询,我得到 423

的计数
    select count(*) from QC10.DEFECTS d 
inner join QC10.DEFECTS_TRAN t on D.RECORD_ID=T.DEFECT_ID_FK_DT 
where 
 T.LATEST_RECORD='Y'
 and
 (t.status NOT IN ('Cancelled', 'Duplicate'))

但是当我运行以下查询时,我得到 8530 作为计数

select count(*) from QC10.DEFECTS d 
inner join QC10.DEFECTS_TRAN t on D.RECORD_ID=T.DEFECT_ID_FK_DT 
where 
 T.LATEST_RECORD='Y'
 and
 (t.status NOT IN ('Cancelled', 'Duplicate'))
 or (t.status IS NULL) 

2 个答案:

答案 0 :(得分:1)

此行为绝对正确 - NULL被认为没有任何价值,并且与您提供的任何INNOT IN列表都不匹配。如果要避免使用OR,可以使用COALESCE替换已知的未使用值:

and
(COALESCE(t.status, 'NULL') NOT IN ('Cancelled', 'Duplicate'))

答案 1 :(得分:1)

修复你的括号:

and
 (t.status NOT IN ('Cancelled', 'Duplicate')
 or t.status IS NULL)

您输入的查询会返回status IS NULL的所有行,无论他们是否为latest_record='Y'