在Postgres中将列拆分为多行

时间:2015-04-02 18:31:14

标签: sql postgresql split set-returning-functions

假设我有一个这样的表:

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

subject的类型为textflag的类型为int。我想在Postgres中将此表转换为类似的内容:

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

有一种简单的方法吗?

2 个答案:

答案 0 :(得分:45)

在Postgres 9.3+中使用LATERAL加入:

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

请注意,LATERAL连接的简写形式仅返回行,如果unnest()实际返回行。

您也可以使用regexp_split_to_table(),但这通常较慢,因为正则表达式匹配会花费更多 相关:

答案 1 :(得分:0)

我认为没有必要使用联接,只需将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                                                                                                   

(4行)