首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将逗号分隔值拆分为固定列数的目标表

将逗号分隔值拆分为固定列数的目标表
EN

Stack Overflow用户
提问于 2021-02-20 19:46:10
回答 4查看 150关注 0票数 2

我在Postgres 13.1数据库中有一个只有一列的表。它由许多带有逗号分隔值的行组成-最多大约20个元素。

我想将数据拆分为多个列。但是我只有有限数量的列,比如在单行中有5个和5个以上的CSV值,所以多余的值必须转移到新的/下一行)。如何做到这一点?

示例:

代码语言:javascript
运行
复制
a1, b1, c1
a2, b2, c2, d2, e2, f2
a3, b3, c3, d3, e3, f3, g3, h3, i3, j3
a4
a5, b5, c5
'
'
'

列只有5列,因此输出将如下所示:

代码语言:javascript
运行
复制
c1 c2 c3 c4 c5
---------------
a1 b1 c1
a2 b2 c2 d2 e2 
f2
a3 b3 c3 d3 e3
f3 g3 h3 i3 j3
a4
a5 b5 c5
'
'
'
EN

Stack Overflow用户

发布于 2021-02-20 21:47:38

代码语言:javascript
运行
复制
CREATE UNLOGGED TABLE foo( x TEXT );
\copy foo FROM stdin
a1, b1, c1
a2, b2, c2, d2, e2, f2
a3, b3, c3, d3, e3, f3, g3, h3, i3, j3
a4
a5, b5, c5
\.

从行到单列...

代码语言:javascript
运行
复制
SELECT (ROW_NUMBER() OVER () - 1)/5 AS r, u FROM (SELECT unnest(string_to_array(x,', ')) u from foo) y;
 r | u
---+----
 0 | a1
 0 | b1
 0 | c1
 0 | a2
 0 | b2
 1 | c2
 1 | d2
...etc

...and返回到已知长度的行。

代码语言:javascript
运行
复制
SELECT r,array_agg(u) a FROM (
 SELECT (ROW_NUMBER() OVER () - 1)/5 AS r, u FROM (
  SELECT unnest(string_to_array(x,', ')) u from foo) y) y1 
GROUP BY r ORDER BY r;
 r |    a
---+------------------
 0 | {a1,b1,c1,a2,b2}
 1 | {c2,d2,e2,f2,a3}
 2 | {b3,c3,d3,e3,f3}
 3 | {g3,h3,i3,j3,a4}
 4 | {a5,b5,c5}

之后,您可以对每一列使用a[]将其插入到表中。如何处理最后一行留给读者作为练习……

票数 3
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66291134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档