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