web-dev-qa-db-ja.com

Postgresで列を複数の行に分割する

次のようなテーブルがあるとします:

    subject     | flag
----------------+------
 this is a test |    2

subjecttext型であり、flagint型です。 Postgresでこのテーブルを次のように変換したいと思います。

    token       | flag
----------------+------
 this           |    2
 is             |    2
 a              |    2
 test           |    2

これを行う簡単な方法はありますか?

33
mgoldwasser

Postgres 9.3以降では、LATERAL結合を使用します。

_SELECT s.token, flag
FROM   tbl t, unnest(string_to_array(t.subject, ' ')) s(token)
WHERE  flag = 2;
_

unnest()が実際に行を返す場合、LATERAL結合の短縮形は行のみを返すことに注意してください。

regexp_split_to_table() を使用することもできますが、正規表現のマッチングには少しコストがかかるため、通常は遅くなります。
関連:

51

結合を使用する必要はないと思います。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                                                                                                   
3
Matt