Список столбцов таблицы, в которой есть по крайней мере одна строка с ненулевым значением для конкретного запроса - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь найти правильный запрос:

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

Значение: я увижу, в каких столбцах задано хотя бы одно значение в записи, возвращенной моим заданным запросом.

Надеюсь, я достаточно ясно.

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Пожалуйста, проверьте ниже анонимный блок для вашего случая, имя таблицы должно быть указано в 3 местах в запросе ниже

Declare
v_columnlist varchar2(32627);
v_noofcolumns number;
Columnnm  varchar2(1000);
Finalcolumns varchar2(32627);
v_count  number:=0;
plsql_block varchar2(32627);

Begin

select LISTAGG(column_name,',') within group (order by column_id),max(column_id) 
into v_columnlist , v_noofcolumns
from user_tab_columns 
where table_name='tablename';

FOR Lcntr IN 1..v_noofcolumns
LOOP

select REGEXP_SUBSTR(v_columnlist,'[^,]+',1,Lcntr)
into Columnnm
from dual;

plsql_block := 'select count(*)  from tablename  where '|| Columnnm || ' is not null ';

EXECUTE IMMEDIATE plsql_block into v_count;

IF v_count > 1 THEN 
Finalcolumns:= LTRIM(Finalcolumns ||','||Columnnm,',');

END IF;

END LOOP;

plsql_block := 'select ' || Finalcolumns ||' from tablename ';

DBMS_OUTPUT.PUT_LINE(plsql_block);

END;
0 голосов
/ 07 сентября 2018

Я думаю, вам нужно что-то следующее:

SELECT CASE WHEN MAX(col1) IS NOT NULL THEN 'COL1' END ||','
    || CASE WHEN MAX(col2) IS NOT NULL THEN 'COL2' END ||','
    ...
  FROM T

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

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