在 postgresql 查询中需要拆分行的帮助

Posted

技术标签:

【中文标题】在 postgresql 查询中需要拆分行的帮助【英文标题】:need help on split row in postgresql query 【发布时间】:2018-07-09 07:38:36 【问题描述】:

我有一个下表,我需要按 role_collection 值拆分行:

name   role_collection     date
------------------------------------
raj    3,5                 2018 6 12
gopi   2,3,6               2018 6 12
mani   3,4,5,7             2018 6 12

现在我需要这样的输出:

name   role   date
------------------------
raj    3      2018 6 12
raj    5      2018 6 12
gopi   2      2018 6 12
gopi   3      2018 6 12
gopi   6      2018 6 12
mani   3      2018 6 12
mani   4      2018 6 12
mani   5      2018 6 12
mani   7      2018 6 12

【问题讨论】:

您能否添加查询以重新创建您的表。广告请修正格式。所以我们可以轻松复制数据 你没有显示你的表的定义,没有它很难给出一个好的答案。见Why should I provide an MCVE for what seems to me to be a very simple SQL query? 您不应该将逗号分隔的值存储在单个列中。如果您已正确规范化您的数据模型,您现在不需要“拆分”这些值 【参考方案1】:

欢迎来到 ***。

假设你有如下表结构:

CREATE TABLE t (name TEXT, role_collection TEXT, d DATE);

还有你的样本数据:

INSERT INTO t VALUES ('raj','3,5','2018-6-12'),
                     ('gopi','2,3,6','2018-6-12'),
                     ('raj','3,4,5,7','2018-6-12');

使用STRING_TO_ARRAY 创建一个包含逗号分隔的role_collection 值的数组 - 如果列role_collection 还不是TEXT[]VARCHAR[] 类型。然后使用UNNEST可以提取这个数组的所有元素,如下所示:

SELECT name, UNNEST(STRING_TO_ARRAY(role_collection,',')),d 
FROM t;
 name | unnest |     d      
------+--------+------------
 raj  | 3      | 2018-06-12
 raj  | 5      | 2018-06-12
 gopi | 2      | 2018-06-12
 gopi | 3      | 2018-06-12
 gopi | 6      | 2018-06-12
 raj  | 3      | 2018-06-12
 raj  | 4      | 2018-06-12
 raj  | 5      | 2018-06-12
 raj  | 7      | 2018-06-12
(9 Zeilen)

【讨论】:

以上是关于在 postgresql 查询中需要拆分行的帮助的主要内容,如果未能解决你的问题,请参考以下文章

如何阻止查询结果在列之间拆分单个行的数据?

特定 PostgreSQL 客户端/版本中的慢查询

更新查询 Postgresql 更新缓慢

将分隔列拆分为另一个表中的单独行的高效查询

PostgreSQL大表的更新时间

返回行的简单 PostgreSQL 函数