数据库有很多列(超过100个)。其中一些列具有空条目。如何在不手动测试每一列的情况下找出至少一行中有多少列具有空条目?
答案 0 :(得分:4)
尝试:
declare
l_count integer;
begin
for col in (select table_name, column_name
from user_tab_columns where table_name='EMP')
loop
execute immediate 'select count(*) from '||col.table_name
||' where '||col.column_name
||' is not null and rownum=1'
into l_count;
if l_count = 0 then
dbms_output.put_line ('Column '||col.column_name||' contains only nulls');
end if;
end loop;
end;
答案 1 :(得分:2)
尝试分析您的表格(计算统计数据,不要估算),然后(立即)执行:
select column_name, num_nulls
from all_tab_columns
where table_name = 'SOME_TABLENAME'
and owner = 'SOME_OWNER';
当然,随着数据的变化,这将变得更加不正确。如果你需要更多花哨并进行字段填充计数(fieldpop),那么你需要遍历所有行并显式检查空值(并排除你认为“未填充”的任何其他值,可能默认值为0例如,对于数字字段)。
答案 2 :(得分:0)
我可以给你研究的方向:
选中“user_tab_columns”,您可以通过该“user_tab_columns”获取与表中列相关的信息。 E.g。
select count(*) from user_tab_columns where table_name = 'YOURTABLENAME'
这将为您提供该表中的列数。
与此同时,您需要使用游标来检查每个列的空值,而不是在每个列的WHERE子句中添加空检查。
答案 3 :(得分:0)
这将为您提供每行数据的NULL列值数:
declare
TYPE refc IS REF CURSOR;
col_cv refc;
l_query varchar(3999);
v_rownum number;
v_count number;
begin
l_query := 'select rownum, ';
for col in (select table_name, column_name
from user_tab_columns where table_name='EMP')
loop
l_query := l_query ||'DECODE('||col.column_name||',NULL,1,0)+';
end loop;
l_query := l_query||'+0 as no_of_null_values from EMP';
DBMS_OUTPUT.PUT_LINE(l_query);
OPEN col_cv FOR l_query;
LOOP
FETCH col_cv into v_rownum, v_count;
EXIT WHEN col_cv%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v_rownum || ' ' || v_count);
END LOOP;
CLOSE col_cv;
end;
即使写它也感觉很脏! (当表中的列数非常大且l_query溢出时,它将无法工作。)
您只需更改表名(上面的EMP)。