Как объединить столбцы данных, используя l oop? - PullRequest
1 голос
/ 09 марта 2020

Как объединить данные столбцов, используя l oop in Postgres?

У меня есть эта таблица:

+------+------+------+--------+--------+--------+
| col1 | col2 | col3 | other1 | other2 | other3 |
+------+------+------+--------+--------+--------+
|    1 |    1 |    1 |      1 |      1 |      1 |
|    2 |    2 |    2 |      2 |      2 |      2 |
+------+------+------+--------+--------+--------+

и я хочу объединить столбцы (столбец *).

Ожидаемый результат:

+----------------+--------+--------+--------+
| concatedcolumn | other1 | other2 | other3 |
+----------------+--------+--------+--------+
| **1**1**1**    |      1 |      1 |      1 |
| **2**2**2**    |      2 |      2 |      2 |
+----------------+--------+--------+--------+

Я могу конкатать, используя:

select concat('**', col1, '**',col2, '**', col3, '**') as concatedcolumn
      ,other1, other2, other3
from sample_table

У меня есть около 200 столбцов с префиксом "col" и не хочу изложить все столбцы в sql. Как я могу добиться этого с помощью Al oop?

1 Ответ

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

Помимо сомнительного проектирования базы данных, вы можете динамически сгенерировать оператор SELECT:

SELECT 'SELECT concat_ws(''**'', '
     || string_agg(quote_ident(attname), ', ') FILTER (WHERE attname LIKE 'col%')
     || ') AS concat_col, '
     || string_agg(quote_ident(attname), ', ') FILTER (WHERE attname NOT LIKE 'col%')
     || ' FROM public.tbl;'                  -- your table name here
FROM   pg_attribute
WHERE  attrelid = 'public.tbl'::regclass     -- ... and here
AND    attnum > 0
AND    NOT attisdropped;

db <> fiddle здесь

Запросить системный каталог pg_attribute или, альтернативно, таблицу информационной схемы columns. Я предпочитаю системный каталог.

Выполнить на втором шаге (после проверки того, что вы хотите).

Нет l oop вовлечено. Вы можете построить оператор динамически, но вы не можете (легко) вернуть результат динамически, поскольку SQL требует знать тип возвращаемого значения во время выполнения.

concat_ws() удобно, но игнорирует значения NULL. Я не имел дело с этим специально. Вы можете или не можете сделать это. Похожие:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...