2017-01-23 14 views
0

null値を持つテーブルセットのすべてのカラムを検索したいとします。plsql null値を含むすべてのtable.columnを一覧表示します。

私は、テーブル名とカラム名

SELECT TABLE_NAME, COLUMN_NAME 
FROM user_tab_cols 
where nullable='Y' 
     and table_name in ('myTalbe', 'myTable2'); 

を見つけても、インクルードがヌル

select count(*) from myTable where myColumn is null; 

が、どのように私は、結果として持っているtoghether

table_name  column_name 
myTable  myColumn 
myTable  myCol2 
myTable2  col4 
+0

あなたは列の値がnull(空)であることを意味しますか? – Moudiz

答えて

1
これを置くことができるかどうかを確認することができます

動的SQLを使用するアプローチがありますが、これにはPL/SQLコードが必要です。

declare 
    type tableOfNumber is table of number; 
    type tableOfChar is table of varchar2(30); 
    -- 
    vSQl   varchar2(4000); 
    vListNumbers tableOfNumber; 
    vListTables  tableOfChar; 
    vListColumns tableOfChar; 
begin 
    select listagg('select ''' || 
         table_name || ''' as table_name, ''' || 
         column_name || ''' as column_name, count(*) as rowCount from ' || 
         table_name || 
         ' where ' || 
         column_name || 
         ' is null having count(*) > 0' , 
        ' UNION ALL ' 
        ) within group (order by table_name, column_name) 
    into vSQL 
    from user_tab_columns 
    where nullable='Y' 
      and table_name in ('myTalbe', 'myTable2'); 
    -- 
    dbms_output.put_line(vSQL); 


    /* whatever you may want to do with the query */ 


    /* for example, fetch into some variables and print the result */ 
    execute immediate vSQL 
    bulk collect into vListTables, vListColumns, vListNumbers; 
    -- 
    if vListTables.count() > 0 then 
     for i in vListTables.first .. vListTables.last loop 
      dbms_output.put_line('Table ' || vListTables(i) || 
            ', column ' || vListColumns(i) || 
            ', number of nulls: ' || vListNumbers(i) 
           ); 
     end loop; 
    end if; 
end; 
0

ここではまさにそれを行うには、私はしばらく前に書いたルーチンだ:

select * 
from (
     select table_name, 
       column_name, 
       to_number(extractvalue(xmltype(dbms_xmlgen.getxml('select count(*) c from '||table_name || ' where ' || column_name || ' is null')),'/ROWSET/ROW/C')) as rowcount 
     from user_tab_columns 
     where nullable='Y' 
      and table_name in ('myTalbe', 'myTable2') 
    ) 
where rowcount > 0 

これは、動的SQLでのアプローチが考えられます。次はあなたが必要な結果を得るためにSQLを使用しています。必要なDDLを出力して、NULL可能ではない(ただし、NULLを含まない)列をNULL可能にしません。

https://connormcdonald.wordpress.com/2016/03/11/tightening-up-your-data-model/

これは、スキーマまたは単一のテーブルのための作業を行うことができます。

関連する問題