Разделить столбцы на несколько строк в 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