0

我已经做了一些研究,在大多数情况下,小桌子的答案都是可以接受的。我正在使用一个大约有 25 列的表。我想要做的是计算整个表中有多少空值。据我了解,count() 将计算条件语句为真的行。例如,给定一个有 12 行的表“some_table”并给出以下语句:

Select Count(*) from some_table 
where condition = true

不管表有多少列,都将返回 12(如果这些行中的每一行都符合条件)。现在,如果您要计算给定场景的空值,如果表很小,您可以这样做。但如果不是呢?如何在不进行大量查询的情况下计算列上的多个空值?

4

3 回答 3

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
于 2013-10-22T18:33:05.440 回答
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 = ...
于 2013-12-02T08:01:44.230 回答
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 包编写单个动态语句,而不是为每一列执行循环,但这需要更多的编码工作,并且只有在您关心性能时才值得。

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

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;
于 2013-12-01T21:46:28.513 回答