如何用逗号分割行并在 PostgreSQL 中取消透视表?

Posted

技术标签:

【中文标题】如何用逗号分割行并在 PostgreSQL 中取消透视表?【英文标题】:How to split the row by a comma and unpivot the table in PostgreSQL? 【发布时间】:2022-01-23 20:58:30 【问题描述】:

我有这张表,我想用逗号分隔列并取消透视它

我的桌子

+------------+-------------------+---------------------------+
|birthday_id | child_birthday_id | place                     | 
+------------+------------------ +---------------------------+
|  1         |        9          |  Minsk, Mogilev, Polotsk  | 
+-------+----------+-------------+---------------------------+

我想要 3 行不同的地方

+------------+-------------------+----------------------+
|birthday_id | child_birthday_id | place                | 
+------------+------------------ +----------------------+
|  1         |        9          |  Mogilev             |
|  1         |        9          |  Minsk               | 
|  1         |        9          |  Polotsk             | 
+-------+----------+-------------+----------------------+

我知道如何在 MSSQLS 服务器中使用 CROSS APPLY 但在 Postgres IDK 中使用

SELECT 
    birthday_id , 
    child_birthday_id,
    place
FROM 
    sh.test
    CROSS APPLY STRING_SPLIT(place, ',');

【问题讨论】:

Edit 问题并展示您已经尝试过的内容。解释失败的原因/位置。具体(错误消息、意外结果等)。 【参考方案1】:

SQL Server 的 CROSS APPLY 在 Postgres 中转换为 CROSS JOIN LATERAL。要将字符串拆分成表格,可以使用regexp_split_to_table()

SELECT t.birthday_id,
       t.child_birthday_id,
       p.place
       FROM sh.test AS t
            CROSS JOIN LATERAL regexp_split_to_table(t.place, '\s*,\s*') AS p
                                                                            (place);

【讨论】:

【参考方案2】:

您可以使用string_to_array()unnest()

SELECT t.birthday_id , 
       t.child_birthday_id,
       p.place
FROM sh.test t
  CROSS JOIN LATERAL unnest(string_to_array(place, ',')) as p(place);

如果您使用的是 Postgres 14,您也可以使用 string_to_table(t.place, ',')

【讨论】:

您需要CROSS JOIN LATERAL 吗?你能不能不干脆SELECT birthday_id, child_id, unnest(string_to_array(place, ', ')) as place FROM demo GROUP BY 1, 2; @JonathanWillcock:不,你真的不需要它。但我更喜欢在进行交叉连接时明确表达

以上是关于如何用逗号分割行并在 PostgreSQL 中取消透视表?的主要内容,如果未能解决你的问题,请参考以下文章

如何用逗号和空格java分割表达式

如何用逗号分割字符串而不在perl的引号内包含逗号?

如何用括号外的逗号分割字符串?

如何用逗号分割不跟空格的字符串?

java中如何用split对一个字符串按逗号和分号分割成数组

如何用分隔符分割字符串并在bash中交换子字符串的位置?