繁体   English   中英

如何使用 SQL 在表中查找空列和空列

[英]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 脚本:

  • 枚举所有表
  • 枚举表中的列
  • 确定表中的行数
  • 迭代每一列并计算该列中有多少行为 NULL。

如果空列的行数等于表中的行数,则您已找到要查找的内容。

以下是如何在一张表中只处理一列,如果 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM