Oracle - 在所有表中搜索仅包含所有列中的数据

时间:2017-04-02 13:52:09

标签: sql database oracle plsql

我想在所有列中找到所有列中的数据..

例如

ID = 123

的EMPLOYEE表
COLUMNS         DATA
ID              1
NAME            TEST
ADDRESS         TESTADDRESS
PHONE             
EMAIL         
POSITION        DEV

输出将是ID,NAME,ADDRESS和POSITION ..所以基本上所有列都只包含数据..

顺便说一句,我不能依赖USER_TAB_COLUMNS中的NUM_DISTINCT ..

1 个答案:

答案 0 :(得分:0)

您可以收集表格的统计信息,并查看NUM_NULLS中的DBA_TAB_COL_STATISTICS列。一切都在documentation中描述。

如果由于某种原因你不能这样做,那么使用像这个简单的PL / SQL块:

declare 
    v_nulls number;
    v_sql varchar(4000);
begin 
    for t in (select table_name from user_tables order by table_name) 
    loop
        dbms_output.put_line('====== Table: '||t.table_name);
        for c in (select column_name 
                    from user_tab_cols 
                    where table_name = t.table_name order by column_name) 
        loop
            v_sql := 'select count(case when '||c.column_name||' is null then 1 end) '
                     ||'  from '||t.table_name;

            execute immediate v_sql into v_nulls;

            if v_nulls = 0 then
                dbms_output.put_line(rpad(c.column_name, 30)||' - no nulls found');
            else
                dbms_output.put_line(rpad(c.column_name, 30)||' - contains null values');
            end if;
        end loop;
    end loop;
end;

示例输出:

====== Table: CARS
CID                            - no nulls found
MODEL                          - contains null values
PID                            - contains null values
====== Table: PEOPLE
NAME                           - no nulls found
PID                            - no nulls found

我们正计算架构中每个表中每列的空值,因此这可能很慢。收集统计数据是做这些事情的正确方法。

例如,如果您需要有关表EmployeeCourses中的列的信息,请在第一个循环中添加适当的where clause

select table_name from user_tables where table_name in ('Employee', 'Courses')