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