Создание динамических столбцов из данных таблицы

Пример данных таблицы:

--------------------------
| key | domain | value   |
--------------------------
| a   | en     | English |
| a   | de     | Germany |

Запрос, который возвращает нужный мне результат:

select * from 
(
    select t1.key,
        (select value from TABLE where t1.key=key AND code='en') en,
        (select value from TABLE where t1.key=key AND code='de') de
    from TABLE t1
) as t2

Данные, полученные по запросу:

---------------------------
| key | en      | de      |
---------------------------
| a   | English | Germany |

Я не хочу перечислять все доступные домены с:

(select value from TABLE where t1.key=key AND code='*') *

Можно ли сделать этот запрос более динамичным в Postgres: автоматически добавлять все столбцы домена, существующие в таблице?

Итак, вы хотите, чтобы все отдельные ненулевые значения домена были в качестве имен столбцов? Вероятно, вам придется использовать динамический sql в plpgsql и выполнять его с помощью EXECUTE.

404 24.04.2018 16:09

Динамическое количество столбцов? Обычный SQL не может этого сделать, но pl / pgSQL может, как говорит @eurotrash.

The Impaler 24.04.2018 16:23
Динамический сводный запрос
Lukasz Szozda 24.04.2018 16:37
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
3
95
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для более чем нескольких доменов используйте crosstab(), чтобы сделать запрос короче и быстрее.

Динамический запрос полностью, возвращающий динамическое количество столбцов на основе данных в вашей таблице, невозможен, поскольку SQL строго типизирован. Что бы вы ни пытались, вам понадобится два шага. Шаг 1: сгенерируйте запрос, шаг 2: выполните его.

Или вы возвращаете что-то более гибкое вместо столбцов таблицы, например массив или тип документа, например json. Подробности:

Другие вопросы по теме