Как найти номер пустого столбца в таблице, используя PL / SQL - PullRequest
1 голос
/ 09 июня 2011

База данных имеет много столбцов (более 100).Некоторые из этих столбцов имеют нулевые записи.Как я могу узнать, сколько столбцов имеют нулевые записи хотя бы в одной строке, без проверки вручную каждого столбца?

Ответы [ 4 ]

4 голосов
/ 09 июня 2011

Попробуйте:

declare
  l_count integer;
begin
  for col in (select table_name, column_name 
              from user_tab_columns where table_name='EMP')
  loop
    execute immediate 'select count(*) from '||col.table_name
                      ||' where '||col.column_name
                      ||' is not null and rownum=1'
      into l_count;
    if l_count = 0 then
      dbms_output.put_line ('Column '||col.column_name||' contains only nulls');
    end if;
  end loop;
end;
2 голосов
/ 09 июня 2011

Попробуйте проанализировать вашу таблицу (вычислить статистику, не оценивать), а затем (немедленно) выполнить:

select column_name, num_nulls
from all_tab_columns
where table_name = 'SOME_TABLENAME'
and owner = 'SOME_OWNER';

Конечно, по мере изменения данных, это станет немного болееневерен.Если вам нужно получить больше фантазий и выполнить подсчет населения поля (fieldpop), то вам нужно будет циклически пройти по всем строкам и явно проверять наличие нулей (и исключать любые другие значения, которые вы считаете "не заполненными", возможно, по умолчанию 0для числового поля, например).

0 голосов
/ 09 июня 2011

Это даст вам количество значений столбца 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, ';
  for col in (select table_name, column_name 
              from user_tab_columns where table_name='EMP')
  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 EMP';

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;

Я чувствую себя грязно, даже когда пишу это! (Это не будет работать, если количество столбцов в таблице очень велико и l_query переполняется).

Вам просто нужно изменить имя таблицы (EMP выше).

0 голосов
/ 09 июня 2011

Я могу дать вам направление исследования:

Установите флажок «user_tab_columns», с помощью которого вы можете получить информацию, связанную со столбцами в таблице. Э.Г.

select count(*) from user_tab_columns where table_name = 'YOURTABLENAME'

Это дает вам количество столбцов в этой таблице.

Вместе с этим вам нужно будет использовать курсор, я думаю, чтобы проверять каждый столбец на наличие нулевых значений, а не добавлять нулевую проверку в предложении WHERE для каждого столбца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...