簡體   English   中英

在 Postgres 中將列拆分為多行

[英]Split column into multiple rows in Postgres

假設我有一個這樣的表:

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

subjecttext類型, flagint類型。 我想在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM