Postgres で列を複数の行に分割する
次のような複数の値を含む列を持つテーブルがあるとします。
subject | flag --------+----- this is a test | 2
このテーブルを、元の列の各値が個別になる新しい構造に変換する必要がある場合があります。次のような行:
token | flag --------+----- this | 2 is | 2 a | 2 test | 2
LATERAL Join を使用したソリューション (Postgres 14)
Postgres 14 以降では、次の LATERAL Join を使用してこれを達成する効率的な方法が提供されます。 string_to_table() 関数。この関数は、対象の列をトークンの配列に分割します。
SELECT token, flag FROM tbl, string_to_table(subject, ' ') AS token WHERE flag = 2;
string_to_array() による解決策 (Postgres 13-)
Postgres 13 以前の場合は、次を使用します。代わりに string_to_array() 関数string_to_table():
SELECT unnest(string_to_array(subject, ' ')) AS token, flag FROM tbl WHERE flag = 2;
正規表現を使用した代替解決策
もう 1 つのオプションは、string_to_table() よりも効率が劣りますが、regexp_split_to_table() 関数を使用することです。アプローチ:
SELECT s.token, t.flag FROM tbl t CROSS JOIN regexp_split_to_table(subject, ' ') AS s(token) WHERE t.flag = 2;
追加メモ
以上がPostgreSQLで列を複数の行に分割するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。