在Postgres中将列拆分为多行

mgo*_*ser 38 sql postgresql split set-returning-functions

假设我有一个这样的表:

    subject     | flag
----------------+------
 this is a test |    2
Run Code Online (Sandbox Code Playgroud)

subject属于类型text,flag属于类型int.我想在Postgres中将此表转换为类似的内容:

    token       | flag
----------------+------
 this           |    2
 is             |    2
 a              |    2
 test           |    2
Run Code Online (Sandbox Code Playgroud)

是否有捷径可寻?

Erw*_*ter 57

在Postgres 9.3+中使用LATERAL连接:

SELECT s.token, flag
FROM   tbl t, unnest(string_to_array(t.subject, ' ')) s(token)
WHERE  flag = 2;
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Manngo:这*是*横向连接,只是语法很短。详细等效:`SELECT * FROM tbl t CROSS JOIN LATERAL unnest(string_to_array(t.subject, ' ')) AS s(token);` 链接答案中有充分的解释。 (2认同)

小智 5

我认为没有必要使用联接,只需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                                                                                                   
Run Code Online (Sandbox Code Playgroud)