Как найти номер нулевого столбца в таблице с помощью PL / SQL

#sql #oracle #plsql

#sql #Oracle #plsql

Вопрос:

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

Комментарии:

1. Хотите проверить для каждой строки в таблице, сколько столбцов имеют значение null, или вы хотите знать, какие столбцы таблицы содержат ТОЛЬКО нулевые значения во всех строках?

2. или сколько столбцов МОЖЕТ содержать null? Пожалуйста, более подробно..

3. @Daniel Hilgarth я хочу проверить, сколько столбцов в этой таблице имеют значение null

4. может случиться так, что для этого столбца отсутствовала какая-то ссылка, и вместо значения принималось значение null.. итак, как идентифицировать эти столбцы

5. Трудно понять, что вы имеете в виду. Можете ли вы привести пример? На что похожа таблица, что вы ищете в этой таблице и как должен выглядеть результат? Я предполагаю, что у вас есть таблица со 100 столбцами, и вы хотите добавить проверку col1 is null or col2 is null or ... or coln is null

Ответ №1:

Попробуйте:

 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:

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

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

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

Ответ №3:

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

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

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

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

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

Комментарии:

1. @ LUKAS хорошо , итак , мы хотим ПРОВЕРИТЬ каждый столбец … а что, если у нас есть столбец 500

Ответ №4:

Это даст вам количество нулевых значений столбца в строке данных:

 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 выше).