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

Posted

技术标签:

【中文标题】Oracle - 在所有表中搜索所有列中的数据【英文标题】:Oracle - Search in all tables with data only in all columns 【发布时间】:2017-04-02 13:52:08 【问题描述】:

i',m 试图在所有列中包含数据的所有表中查找..

例子

ID = 123 的 EMPLOYEE 表

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

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

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

【问题讨论】:

该行并非所有列都有数据,因此该表没有。我完全不确定您要做什么。您是否尝试列出该表中包含该 ID 或任何 ID 数据的列名?或者在“所有表”中 - 这是什么,模式中的所有表?并再次基于特定的键?还是别的什么? 对您的要求有点困惑,您提到了搜索,但专注于问题中的显示。似乎你可能有两个问题在这里你想结合起来。 【参考方案1】:

您可以收集表的统计信息并检查DBA_TAB_COL_STATISTICS 中的NUM_NULLS 列。 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')

【讨论】:

以上是关于Oracle - 在所有表中搜索所有列中的数据的主要内容,如果未能解决你的问题,请参考以下文章

在数据库中搜索列中具有特定值的所有表

Oracle在所有表的所有列中搜索字符串[重复]

oracle中列中的数据求和

Oracle SQL:比较 2 列中的所有值并交换它们

如何用另一个表中的匹配值替换/更新列中每个字符串的所有实例?

oracle数据库之SQL结构化查询语言