SQL COUNT()将NULL计为不同的值

时间:2014-07-08 15:47:12

标签: sql oracle count null distinct

我想确保此查询正在执行我想要的操作。我正在使用Oracle SQL Developer版本4.02.15.21。

基本上我有一个ID列和一个Value列(都是CHAR),我需要检查一些ID是否有多个值。如果有一些我想知道这些是哪些ID。每个ID应该只有1个值 - 所以每次列出ID时,它应该始终具有该值,而不是不同的值(大多数ID将被列出多次)。

这很简单但是我需要将NULL值作为一个不同的值来计算。 如果有意义的话,我正在寻找像其他任何唯一值一样对待的NULL。意思是,ID的值可以是NULL或NOT NULL但是我需要能够查看是否存在与相同ID关联的任何其他不同的值(无论它们是NULL还是NOT NULL)。所以我写了这个查询:


- 显示具有多个值关联的ITEM ID -

SELECT I.ID, COUNT( DISTINCT (CASE WHEN I.VALUE IS NULL THEN '1' ELSE I.VALUE END) ) 
FROM ITEMS I
GROUP BY I.ID
HAVING COUNT( DISTINCT (CASE WHEN I.VALUE IS NULL 
                             THEN '1' ELSE I.VALUE END) ) > 1
ORDER BY I.ID

我们的想法是将NULL值转换为'1'(实际值是10个字母CHAR字符串,因此'1'将始终是唯一的),以便COUNT将计算NULL值,以便如果列出了ID在每种情况下,对于Value,8次为NULL,它仍然会显示ID只有1个与之关联的值('1')。

这看起来是否正确?它适用于包含数千个条目的表格,到目前为止,我的所有结果都没有出现任何行。我不确定这是否正确。哦,我不关心时间表现或类似的事情。

谢谢你看看。

2 个答案:

答案 0 :(得分:3)


我会这样做:

SELECT count(coalesce( I.VALUE , 1)) FROM table;

http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions023.htm#SQLRF00617

答案 1 :(得分:0)

这大多是正确的。由于在Sql中空值基本上是 nothing ,因此无法计算,因此执行CASE是一个很好的解决方案。但是为了确保您收到的结果是正确的结果,请在没有HAVING的情况下运行此查询,并使用JOIN将结果与原始查询和表的结果进行比较。