我想在所有列中找到所有列中的数据..
例如
ID = 123
的EMPLOYEE表COLUMNS DATA
ID 1
NAME TEST
ADDRESS TESTADDRESS
PHONE
EMAIL
POSITION DEV
输出将是ID,NAME,ADDRESS和POSITION ..所以基本上所有列都只包含数据..
顺便说一句,我不能依赖USER_TAB_COLUMNS中的NUM_DISTINCT ..
答案 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
我们正计算架构中每个表中每列的空值,因此这可能很慢。收集统计数据是做这些事情的正确方法。
例如,如果您需要有关表Employee
和Courses
中的列的信息,请在第一个循环中添加适当的where clause
。
select table_name from user_tables where table_name in ('Employee', 'Courses')