[英]How to find null and empty columns in a table with SQL
我正在使用 Oracle SQL 开发人员,我们正在加载带有数据的表,我需要验证是否填充了所有表以及是否有任何列完全为空(该列的所有行都为空)。
对于表,我单击每个表并查看数据选项卡并查找表是否已填充,然后使用过滤器查看每个列以确定是否有任何完全空的列。 我想知道是否有更快的方法来做到这一点。
谢谢,苏雷什
您很幸运 - 有一种使用优化器统计信息的快速简便的方法来获取此信息。
在大量数据加载之后,无论如何都应该收集统计信息。 计数 NULL 是统计数据收集已经在做的事情。 使用 11g 以来的默认设置,Oracle 将 100% 准确地计算 NULL 的数量。 (但请记住,数字只会反映那个时间点。如果您稍后添加数据,则必须重新收集统计信息才能获得更新的结果。)
示例架构
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
当然。 编写一个 SQL 脚本:
如果空列的行数等于表中的行数,则您已找到要查找的内容。
以下是如何在一张表中只处理一列,如果 COUNT 返回为大于 0 的任何值 - 这意味着其中有数据。
SELECT COUNT(<column_name>)
FROM <table_name>
WHERE <column_name> IS NOT NULL;
此查询返回您想要的
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;
下面的脚本可用于获取表中的空列
SELECT column_name
FROM all_tab_cols
where table_name in (<table>)
and avg_col_len = 0;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.