@MZhack

Как изменить запрос для того, чтобы поля (столбцы) создавались динамически?

Как переделать запрос (представление):
SELECT roles.position AS id, divisions.name AS division, roles.name AS role, ranks.name AS rank, staff.name, staff.identity, parameters.id AS param_id, parameters.name AS parameter, "values".id AS val_id, "values".value
FROM roles
JOIN divisions ON roles.division = divisions.id
JOIN staff ON roles.id = staff.role
JOIN ranks ON staff.rank = ranks.id
JOIN "values" ON roles.id = "values".role
JOIN parameters ON "values".parameter = parameters.id

Что бы вместо
id::bigint;division::text;role::text;rank::text;name::text;identity::text;param_id::bigint;parameter::text;val_id::bigint;value::text
---------------------------------------------------------------------
1;"Электрики";"Начальник объекта";"4 группа";"Иваныч";"АА1";1;"Дата рождения";1;"13.09.1986"
1;"Электрики";"Начальник объекта";"4 группа";"Иваныч";"АА1";2;"Пропуск";2;"123-456789"
...

Получить
id::bigint;division::text;role::text;rank::text;name::text;identity::text;parameter_1::text;value_1::text;parameter_2::text;value_2::text
---------------------------------------------------------------------
1;"Электрики";"Начальник объекта";"4 группа";"Иваныч";"АА1";"Дата рождения";"13.09.1986";"Пропуск";"123-456789"

Сделал сейчас через CASE, но не понимаю, как избежать "объявления количества" (... AS value_1, ... AS value_2 и т.д.) полей. Таблица parameters содержит сейчас 18 строк (наименований параметров), но наименования могут быть как добавлены, так и удалены, в связи с этим моё решение бесполезно, а как сделать, чтобы количество полей создавалось динамически в зависимости от количества наименований параметров в таблице parameters не хватает знаний. Прошу помощи знающих.
  • Вопрос задан
  • 98 просмотров
Пригласить эксперта
Ответы на вопрос 2
@alexalexes
1;"Электрики";"Начальник объекта";"4 группа";"Иваныч";"АА1";1;"Дата рождения";1;"13.09.1986"
1;"Электрики";"Начальник объекта";"4 группа";"Иваныч";"АА1";2;"Пропуск";2;"123-456789"

Вот это перерабатывайте в подходящее представление в том процедурном языке, откуда выполняли запрос.
То, что вы пытаетесь сделать - это не задача для SQL.
Ответ написан
otdameskapizm
@otdameskapizm
Помог ответ? Отметь решением...
Можно попробовать сгруппировать значения в массив и потом преобразовать их в строку. Тогда будет что-то в таком стиле. Естественно подразумевается, что значения параметров имеют (приведены) к одному элиасу
SELECT 
   ARRAY_TO_STRING(ARRAY_AGG(value), ',', '*') AS values
FROM ...


| user_id | user_name | values          |
| ------- | --------- | --------------- |
| 1       | John      | Value_1,Value_2 |
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы