2013-10-22 34 views
0

我已经做了一些研究,大部分答案都可以用于小型表格。我正在制作一张有大约25栏的表格。我想要做的是计算整个表中有多少个空值。从我所了解的count()将计算条件语句为true的行。因此,例如,给定一个表“some_table”用12行给出了以下声明:在表格上计算多个空值

Select Count(*) from some_table 
where condition = true 

将返回12,尽管该表有多少列有(如果每个这些行的条件相匹配)。现在,如果您要计算给定场景的空值,那么如果表格很小,则可以这样做。但如果不是呢?你如何计算列上的多个空值而不用查询庞大的数据?

回答

2

也许这样?

Select 
    sum(
    case when field1 is null then 1 else 0 end+ 
    case when field2 is null then 1 else 0 end+ 
    case when field3 is null then 1 else 0 end+ 
    ... 
    case when fieldN is null then 1 else 0 end 
) 
from 
    some_table 
where 
    condition = true 
+0

感谢您的快速回复!我认为这可能会做到。我之前没有成功使用过病例功能,但我认为我错误地使用了它。 编辑: 我刚刚检查出来。这将工作。非常感谢你! – nmaybyte

0

试试这个

DECLARE 
    null_sum NUMBER := 0; 
    null_count NUMBER; 
BEGIN 
    FOR aCol IN (SELECT COLUMN_NAME FROM USER_TAB_COLS WHERE TABLE_NAME = 'SOME_TABLE') LOOP 
     EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM SOME_TABLE WHERE condition = true AND '||aCol.COLUMN_NAME||' IS NULL' INTO null_count; 
     null_sum := null_sum + null_count; 
    END LOOP; 
    DBMS_OUTPUT.PUT_LINE('Table SOME_TABLE has '||null_sum||' NULLS'); 
END; 

而不是做你可以使用DBMS_SQL包写一个动态语句每列一个循环,但是这是更多的精力编写和价值只有在你关心性能。

编辑:找到一个更好的一个没有多个SELECTS的:

DECLARE 
    cols VARCHAR2(1000); 
    null_count NUMBER; 
BEGIN 
    FOR aCol IN (SELECT COLUMN_NAME FROM USER_TAB_COLS WHERE TABLE_NAME = 'SOME_TABLE') LOOP 
     cols := cols||'NVL2('||aCol.column_name||',0,1)+'; 
    END LOOP; 
    EXECUTE IMMEDIATE 'SELECT SUM('||REGEXP_REPLACE(cols, '\+$')||') FROM SOME_TABLE WHERE condition = true' INTO null_count; 
    DBMS_OUTPUT.PUT_LINE ('null_count = ' || null_count); 
END; 
0
select 
    count(*) - count(col1) col1_nulls, 
    count(*) - count(col2) col2_nulls, 
    count(*) - count(col3) col3_nulls, 
    ... 
from 
    some_table 
where 
    condition = ... 

select 
    12*count(*) - 
     count(col1) - 
     count(col2) - 
     ... 
     count(col12) 
from 
    some_table 
where 
    condition = ...