SQL DB2 - Как ВЫБРАТЬ или сравнивать столбцы по их названию? - PullRequest
0 голосов
/ 16 марта 2020

Спасибо за проверку моего вопроса!

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

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

Подробнее : у нас есть (например) 5 различных опросов. У них много вопросов каждый, но некоторые из них являются частью одного и того же показателя c, и нам нужно создать общее поле c, в котором оно хранится. Для этого есть более глубокая предыстория, но для нас это очень важно.

Мы смогли решить эту проблему с помощью операторов COALESCE () или CASE, но проблема в том, что количество опросов / версий опросов продолжает расти, наш поставщик неизбежно генерирует новые столбцы для каждого опроса и его вопросов.

Возьмем этот пример, который мы делаем в настоящее время и который работает достаточно хорошо:

CASE
   WHEN SURVEY_NAME = 'Service1' THEN SERV1_REC
   WHEN SURVEY_NAME = 'Notice1' THEN FNOL1_REC
   WHEN SURVEY_NAME = 'Status1' THEN STAT1_REC
   WHEN SURVEY_NAME = 'Sales1' THEN SALE1_REC
   WHEN SURVEY_NAME = 'Transfer1' THEN Null
   ELSE Null
END REC

А также эта альтернатива, которая работает хорошо:

COALESCE(SERV1_REC, FNOL1_REC, STAT1_REC, SALE1_REC) as REC

Но, как я уже упоминал, в конечном итоге у нас будет, например, "SALE2_RE C", и нам понадобятся ОБА в этом же утверждении. Я хочу создать что-то, где входить в SQL и вносить изменения не нужно. Учитывая, что столбцы ВСЕГДА будут называться " что-то # _RE C" для этой спецификации c metri c, есть ли способ достичь чего-то вроде:

COALESCE(all columns named LIKE '%_REC') as REC

Bonus! Связано, может быть другой способ обойти эту же проблему: также быть способом достичь этого?

SELECT (columns named LIKE '%_REC') FROM ...

Большое спасибо заранее за все ваше время и внимание.

-Kendall

1 Ответ

0 голосов
/ 16 марта 2020

Информация о таблицах и столбцах в Db2 управляется в системном каталоге. Соответствующие представления: SYSCAT.TABLES и SYSCAT.COLUMNS . Вы можете написать:

select colname, tabname from syscat.tables
where colname like some_expression
and syscat.tabname='MYTABLE

Обратите внимание, что предикат LIKE поддерживает выражения, основанные на переменной или результате скалярной функции. Таким образом, вы можете сравнить его с некоторыми динамическими c входными данными.

Рассматривали ли вы сохранение более сложных свойств в значениях JSON или XML? Db2 поддерживает оба, и вы можете запрашивать эти значения с помощью регулярных операторов SQL.

...