Как сгенерировать запрос выбора для таблицы на основе значения другой таблицы в Oracle

У меня есть две таблицы A и B.

Таблица A имеет следующую структуру:

col1 | col2 | col3 | col4 | col5 | ....

Таблица B имеет только одну запись со многими столбцами, например (только 5):

c1 c2 c3 c4 c5 ...
-- -- -- -- --
 1  0  1  1  0 ...

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

Пример 1: Для приведенного выше запроса запись будет выглядеть так:

select col1,
       col3,
       col4
from A; 

Пример 2. Если запись в B выглядит так, как показано ниже

c1 c2 c3 c4 c5 ...
-- -- -- -- --
 0  0  1  1  0 ...

Для приведенного выше запроса записи будет выглядеть так:

select col3,
       col4
from A;

person Laxmikant    schedule 09.11.2018    source источник


Ответы (1)


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

SELECT 
     'SELECT ' ||LISTAGG(
          CASE
               WHEN col = 1 THEN val
          END,',') WITHIN GROUP(
          ORDER BY col
     ) ||' FROM A' as query
  FROM b UNPIVOT ( col
       FOR val
  IN ( c1 as 'COL1',
       c2 as 'COL2',
       c3 as 'COL3',
       c4 as 'COL4',
       c5 as 'COL5') );

демонстрация

person Kaushik Nayak    schedule 09.11.2018
comment
Спасибо за ваш ответ. Можете ли вы также предложить хороший дизайн таблицы для того же типа требований? - person Laxmikant; 09.11.2018
comment
@Laxmikant: трудно сказать, что соответствует вашим первоначальным требованиям, поскольку вы уже достигли точки, когда хотите использовать это в качестве решения. Сказав это, как правило, в rdbms всегда разумно и эффективно хранить значения в виде строк таблицы, а не в виде столбцов (c1, c2, c3... и т. д.), и, насколько это возможно, избегать динамических операторов SQL. - person Kaushik Nayak; 09.11.2018