Sql 计算表上的多个空值

Sql 计算表上的多个空值,sql,oracle,case-when,Sql,Oracle,Case When,我做了一些研究,大部分答案对于小桌子来说都是可以接受的。我正在使用一个大约有25列的表。我想做的是计算整个表中有多少空值。据我所知,count()将对条件语句为true的行进行计数。例如,给定一个包含12行的表“some_table”,并给出以下语句: Select Count(*) from some_table where condition = true 不管表有多少列,都将返回12(如果这些行中的每一行都与条件匹配)。现在,如果要计算给定场景的空值,那么可以在表很小的情况下这样做。但

我做了一些研究,大部分答案对于小桌子来说都是可以接受的。我正在使用一个大约有25列的表。我想做的是计算整个表中有多少空值。据我所知,count()将对条件语句为true的行进行计数。例如,给定一个包含12行的表“some_table”,并给出以下语句:

Select Count(*) from some_table 
where condition = true

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

也许是这样的

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
试试这个

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;


谢谢你的快速回复!我想这可能行。我之前没有成功地使用case函数,但我认为我没有正确地使用它。编辑:我刚查过。这会奏效的。非常感谢你!
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 = ...