Разделить столбцы на несколько строк в Postgres
Предположим, что у меня есть таблица вроде этого:
subject | flag
----------------+------
this is a test | 2
subject
имеет тип text
, а flag
имеет тип int
. Я хотел бы преобразовать эту таблицу в нечто подобное в Postgres:
token | flag
----------------+------
this | 2
is | 2
a | 2
test | 2
Есть ли простой способ сделать это?
Ответы
Ответ 1
В Postgres 9. 3+ использовать LATERAL
присоединиться:
SELECT s.token, flag
FROM tbl t, unnest(string_to_array(t.subject, ' ')) s(token)
WHERE flag = 2;
Обратите внимание, что сокращенная форма LATERAL
соединения возвращает только строки, если unnest()
самом деле возвращает строки.
Вы также можете использовать regexp_split_to_table()
, но это обычно медленнее, потому что сопоставление регулярных выражений стоит немного дороже.
Связанные с:
Ответ 2
Я думаю, что нет необходимости использовать соединение, просто unnest()
в сочетании с string_to_array()
должна сделать это:
SELECT unnest(string_to_array(subject, ' ')) as "token", flag FROM test;
unnest | token
-------+-------
this | 2
is | 2
a | 2
test | 2