Вернуть несколько строк для ячеек, содержащих списки - PullRequest
1 голос
/ 13 декабря 2011

У меня есть что-то вроде этого в postgres db:

| foo | 1,2 | a,b |

И я хочу расширить его до:

| foo | 1 | a |
| foo | 2 | b |

Я знаю, что могу сделать это с plpgsql, но мне интереснобыл путь к этому с sql.

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 13 декабря 2011

Рассмотрим эту демонстрацию:

SELECT name
      ,unnest(a)
      ,unnest(b)
FROM  (VALUES ('foo', '{1,2}'::int[], '{a,b}'::text[])) t(name, a, b)

Результат:

 name | unnest | unnest
------+--------+--------
 foo  |      1 | a
 foo  |      2 | b
(2 rows)

Или, если у вас есть строки, разделенные запятыми, а не Массивы:

SELECT name
      ,regexp_split_to_table(a, ',')
      ,regexp_split_to_table(b, ',')
FROM  (VALUES ('foo', '1,2'::text, 'a,b'::text)) t(name, a, b)

То жеРезультат.
Подробнее о unnest() и regexp_split_to_table() в руководстве.

0 голосов
/ 13 декабря 2011

Желаете ли вы отношения один к одному между элементами списка, предполагая, что в каждой строке есть несколько списков, или есть какая-то связь между элементами, так что вы всегда хотите, чтобы А был привязан к 1 и привязан к 2?

Из одного простого SQL-заявления, не совсем. Я думаю, что вам придется использовать хранимую процедуру и перебрать таблицу. Если он подключается к приложению, вы можете захватить все в одном выражении sql, а затем использовать свой код для его циклического прохождения и разбивать списки из каждой строки.

...