-1

それぞれに100を超えるさまざまな列を持つさまざまなテーブルがあり、それは増加する可能性があります。また、私のテーブルには、一部のデータで null 値を持つ特定の列と、完全に null の列があります

完全にnull値を持つ列が必要なだけです。または、そのテーブルの行数をよりよく理解するには、そのテーブルに存在する列の行のnull数と等しくする必要があります

DECLARE
    TYPE refc IS ref CURSOR;
    col_cv   REFC;
    l_query  VARCHAR(3999);
    v_rownum NUMBER;
    v_count  NUMBER;
BEGIN
    l_query := 'select rownum from &table_name ';

    FOR col IN (SELECT table_name,
                       column_name
                FROM   user_tab_columns
                WHERE  table_name = ' ') LOOP
        l_query := l_query
                   ||'DECODE('
                   ||col.column_name
                   ||',NULL,1,0)+';
    END LOOP;

    l_query := l_query
               ||'+0 as no_of_null_values from ... ';

    dbms_output.Put_line(l_query);

    OPEN col_cv FOR l_query;

    LOOP
        FETCH col_cv INTO v_rownum, v_count;

        EXIT WHEN col_cv%NOTFOUND;

        dbms_output.Put_line(v_rownum
                             || ' '
                             || v_count);
    END LOOP;

    CLOSE col_cv;
END; 
4

3 に答える 3

1

このようなもの:

select sum(case when column_1 is null then 1) as column_1_null_count,
       sum(case when column_2 is null then 1) as column_2_null_count,
       ... the above for all columns ...
       count(*) as total_rows
from the_table
where column_1_null_count = total_rows
   or column_2_null_count = total_rows

その動的ベースの user_tab_columns を生成するのはかなり簡単なはずです。

于 2013-09-05T10:46:17.597 に答える
0

列の値をカウントするには、COUNT(column) を使用します。カウントが 0 の場合、その列には値がありません。つまり、列はすべてのレコードで null です (またはテーブルにレコードが含まれていません)。以下は、値を含まないすべての列を検索する関数です。

declare
  v_count integer;
begin
  for rec in (select table_name, column_name from user_tab_cols) loop
    execute immediate 'select count(' || rec.column_name || ') from ' || rec.table_name into v_count;
    if v_count = 0 then
      dbms_output.put_line(rec.table_name || '.' || rec.column_name);
    end if;
  end loop;
end;
于 2013-09-05T11:38:10.357 に答える