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

Имам две маси А и Б.

Таблица А има структура, както следва:

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