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

mwecs4sa  于 9个月前  发布在  Oracle
关注(0)|答案(6)|浏览(104)

我使用的是Oracle SQL开发人员,我们正在加载数据表,我需要验证是否所有表都已填充,是否有任何列完全为空(该列的所有行都为空)。
对于表,我单击每个表并查看数据选项卡,查找表是否已填充,然后使用过滤器查看每个列,以确定是否有任何完全空的列。我想知道是否有更快的方法来做到这一点。
谢了,苏雷什

yi0zb3m4

yi0zb3m41#

您很幸运-有一种快速简单的方法可以使用优化器统计信息获得此信息。
在大量数据加载之后,无论如何都应该收集统计信息。统计NULL是统计数据收集已经在做的事情。使用自11 g以来的默认设置,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
szqfcxe2

szqfcxe22#

当然可以。写一个SQL脚本:

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

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

aor9mmx1

aor9mmx13#

下面是如何在一个表中只做一列,如果返回的值大于0,这意味着其中有数据。

SELECT COUNT(<column_name>)
FROM <table_name>
WHERE <column_name> IS NOT NULL;
f45qwnt8

f45qwnt84#

  • 此查询返回您想要的 *
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;
sauutmhj

sauutmhj5#

下面的脚本可用于获取表中的空列

SELECT column_name 
      FROM all_tab_cols
     where table_name in (<table>)
       and avg_col_len = 0;
z4iuyo4d

z4iuyo4d6#

以下脚本可用于获取没有行和空列的表,或者,如果您有权限,可以使用dba_tables和dba_tab_tables视图:

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;

相关问题