[英]Split column into multiple rows in Postgres
假設我有一個這樣的表:
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 token, flag
FROM tbl, unnest(string_to_array(subject, ' ')) token
WHERE flag = 2;
FROM
列表中的逗號(幾乎)等同於CROSS JOIN
,對於FROM
列表中的集合返回函數 (SRF),自動假定LATERAL
。 為什么是“幾乎”? 看:
派生表的別名“令牌”也被假定為單個匿名列的列別名,並且我們在查詢中假定不同的列名。 等效,更詳細且不易出錯:
SELECT s.token, t.flag
FROM tbl t
CROSS JOIN LATERAL unnest(string_to_array(subject, ' ')) AS s(token)
WHERE t.flag = 2;
或者將 SRF 移動到SELECT
列表中,這在 Postgres 中是允許的(但在標准 SQL 中是不允許的),效果相同:
SELECT unnest(string_to_array(subject, ' ')) AS token, flag
FROM tbl
WHERE flag = 2;
最后一個似乎可以接受,因為SELECT
列表中的 SRF 已在 Postgres 10 中進行了清理。請參閱:
如果unnest()
不返回任何行(空或 NULL subject
),則(隱式)連接會從結果中刪除該行。 使用LEFT JOIN ... ON true
保留tbl
中的合格行。 看:
我們也可以使用regexp_split_to_table()
,但這通常會更慢,因為正則表達式的成本更高。 看:
我認為沒有必要使用連接,只需將unnest()
函數與string_to_array()
結合使用即可:
SELECT unnest(string_to_array(subject, ' ')) as "token", flag FROM test;
token | flag
-------+-------
this | 2
is | 2
a | 2
test | 2
使用正則表達式拆分到表功能,包括橫向連接,
SELECT s.token, flag
FROM tbl t, regexp_split_to_table(t.subject, ' ') s(token)
WHERE flag = 2;
有關函數詳細信息,請參閱https://www.postgresql.org/docs/9.3/functions-string.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.