次のようなテーブルがあるとします:
subject | flag
----------------+------
this is a test | 2
subject
はtext
型であり、flag
はint
型です。 Postgresでこのテーブルを次のように変換したいと思います。
token | flag
----------------+------
this | 2
is | 2
a | 2
test | 2
これを行う簡単な方法はありますか?
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()
を使用することもできますが、正規表現のマッチングには少しコストがかかるため、通常は遅くなります。
関連:
結合を使用する必要はないと思います。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