create table test1(a number); --Has non-null values.
create table test2(b number); --Has NULL only.
create table test3(c number); --Has no rows.
insert into test1 values(1);
insert into test1 values(2);
insert into test2 values(null);
commit;
收集统计数据并运行查询
begin
dbms_stats.gather_schema_stats(user);
end;
/
select table_name, column_name, num_distinct, num_nulls
from user_tab_columns
where table_name in ('TEST1', 'TEST2', 'TEST3');
使用NUM_DISTINCT和NUM_NULLS可以判断列是否有非NULL(num_distinct > 0)、只有NULL(num_distinct = 0 and num_nulls > 0)或没有行(num_distinct = 0 and num_nulls = 0)。
TABLE_NAME COLUMN_NAME NUM_DISTINCT NUM_NULLS
---------- ----------- ------------ ---------
TEST1 A 2 0
TEST2 B 0 1
TEST3 C 0 0
select table_name,column_name,nullable,num_distinct,num_nulls from all_tab_columns
where owner='SCHEMA_NAME'
and num_distinct is null
order by column_id;
DECLARE
v_owner VARCHAR(100) := 'SCHEMA_NAME';
v_count NUMBER;
v_smt VARCHAR2(500);
BEGIN
FOR t IN (SELECT *
FROM all_tables t
WHERE owner = v_owner
ORDER BY owner, table_name) LOOP
v_smt := 'SELECT COUNT(*) FROM ' || t.owner || '.' || t.table_name;
EXECUTE IMMEDIATE v_smt
INTO v_count;
IF v_count = 0 THEN
dbms_output.put_line('TABLE ' || t.owner || '.' ||
t.table_name || ' IS EMPTY');
ELSE
FOR c IN (SELECT *
FROM all_tab_cols c
WHERE owner = v_owner
AND c.table_name = t.table_name) LOOP
v_smt := 'SELECT COUNT(*) FROM ' || c.owner || '.' ||
c.table_name || ' WHERE ' || c.column_name ||
' IS NOT NULL';
EXECUTE IMMEDIATE v_smt
INTO v_count;
IF v_count = 0 THEN
dbms_output.put_line('COLUMN ' || c.owner || '.' ||
c.table_name || '.' ||
c.column_name || ' IS EMPTY');
END IF;
END LOOP;
END IF;
END LOOP;
END;
6条答案
按热度按时间yi0zb3m41#
您很幸运-有一种快速简单的方法可以使用优化器统计信息获得此信息。
在大量数据加载之后,无论如何都应该收集统计信息。统计NULL是统计数据收集已经在做的事情。使用自11 g以来的默认设置,Oracle将100%准确地计算NULL的数量。(但请记住,这个数字只反映了一个时间点。如果您稍后添加数据,则必须重新收集统计信息以获得更新的结果。)
示例模式
收集统计数据并运行查询
使用NUM_DISTINCT和NUM_NULLS可以判断列是否有非NULL(
num_distinct > 0
)、只有NULL(num_distinct = 0 and num_nulls > 0
)或没有行(num_distinct = 0 and num_nulls = 0
)。szqfcxe22#
当然可以。写一个SQL脚本:
如果列中为空的行数等于表中的行数,则您已经找到了要查找的内容。
aor9mmx13#
下面是如何在一个表中只做一列,如果返回的值大于0,这意味着其中有数据。
f45qwnt84#
sauutmhj5#
下面的脚本可用于获取表中的空列
z4iuyo4d6#
以下脚本可用于获取没有行和空列的表,或者,如果您有权限,可以使用dba_tables和dba_tab_tables视图: