我有逗号柱分离数据这怎么能实现?拆分逗号分隔的列数据到其他列
回答
如果CSV字段的数量是恒定的,那么你可以做这样的事情:
select a[1], a[2], a[3], a[4]
from (
select regexp_split_to_array('a,b,c,d', ',')
) as dt(a)
例如:
=> select a[1], a[2], a[3], a[4] from (select regexp_split_to_array('a,b,c,d', ',')) as dt(a);
a | a | a | a
---+---+---+---
a | b | c | d
(1 row)
如果CSV字段数不恒定那么你可以得到这样的东西的最大数量:
select max(array_length(regexp_split_to_array(csv, ','), 1))
from your_table
然后b为您的查询找到相应的a[1], a[2], ..., a[M]
列表列表。所以,如果上面给了你最多6个,你会用这个:
select a[1], a[2], a[3], a[4], a[5], a[6]
from (
select regexp_split_to_array(csv, ',')
from your_table
) as dt(a)
如果你想,你可以将这两个查询组合成一个函数。
例如,给这个数据(这是最后一排的一个NULL):
=> select * from csvs;
csv
-------------
1,2,3
1,2,3,4
1,2,3,4,5,6
(4 rows)
=> select max(array_length(regexp_split_to_array(csv, ','), 1)) from csvs;
max
-----
6
(1 row)
=> select a[1], a[2], a[3], a[4], a[5], a[6] from (select regexp_split_to_array(csv, ',') from csvs) as dt(a);
a | a | a | a | a | a
---+---+---+---+---+---
1 | 2 | 3 | | |
1 | 2 | 3 | 4 | |
1 | 2 | 3 | 4 | 5 | 6
| | | | |
(4 rows)
由于您的分隔符是一个简单的固定字符串,你也可以使用string_to_array
,而不是regexp_split_to_array
:
select ...
from (
select string_to_array(csv, ',')
from csvs
) as dt(a);
感谢Michael提醒有关此功能。
如果可能的话,您应该重新设计数据库模式以避免使用CSV列。您应该使用数组列或单独的表。
split_part()
做你一步到位想要的东西:
SELECT split_part(col, ',', 1) AS col1
, split_part(col, ',', 2) AS col2
, split_part(col, ',', 3) AS col3
, split_part(col, ',', 4) AS col4
FROM tbl;
添加尽可能多的行,你必须在col
(最大可能)项目。超过数据项的列将为空字符串(''
)。
并且似乎比regexp_split_to_array版本执行速度快得多。 – 2014-04-01 10:05:28
@JohnBarça:所有正则表达式函数都比较昂贵。强大的,但价格... – 2014-04-01 14:31:27
传说!这是迄今为止这种问题最快的方法。 – 2016-03-16 14:14:38
您可以使用拆分功能。
SELECT
(select top 1 item from dbo.Split(FullName,',') where id=1) Column1,
(select top 1 item from dbo.Split(FullName,',') where id=2) Column2,
(select top 1 item from dbo.Split(FullName,',') where id=3) Column3,
(select top 1 item from dbo.Split(FullName,',') where id=4) Column4,
FROM MyTbl
- 1. 更新和拆分逗号分隔的列数据到其他列
- 2. 拆分逗号列MYSQL分隔值
- 3. SQL服务器:逗号分隔的其他逗号分隔栏
- 4. 拆分逗号分隔的参数
- 5. PHP MYSQL - 搜索逗号,逗号分隔列表分隔列表
- 6. 使用逗号分隔符将单列数据拆分为SSIS中的多列
- 7. 将数组拆分成逗号分隔的值列表
- 8. JavaScript:拆分()但保留逗号,点,其他分隔符
- 9. 逗号分隔的列表
- 10. 用逗号分隔的列
- 11. 拆分逗号分隔的字符串并将其添加到列表中
- 12. 拆分上逗号列
- 13. 将逗号分隔列表中的值从其他逗号分隔的列表中删除
- 14. 逗号分隔列表
- 15. 逗号分隔值列出
- 16. @synthesize逗号分隔列表
- 17. 拆分字段的逗号分隔值
- 18. 拆分逗号分隔的字符串
- 19. 拆分逗号分隔的地址
- 20. Sybase IQ - 将列中的逗号分隔值拆分为行
- 21. XSLT拆分逗号分隔的XML列表
- 22. SQL:用查询拆分逗号分隔的字符串列表?
- 23. 将逗号分隔列拆分为SAP HANA中不同的行
- 24. 将逗号分隔的字符串拆分为列
- 25. 数组项的逗号分隔列表
- 26. 在PySpark列表中有条件地拆分逗号分隔值
- 27. 从逗号分隔列表中插入拆分值
- 28. 如何拆分逗号分隔变量?
- 29. 拆分逗号分隔字符串5
- 30. TSQL拆分逗号分隔字符串
感谢应检查并恢复 – Gallop 2011-12-21 11:05:20
考虑使用'string_to_array',而不是'regexp_split_to_array';它应该更快,因为它没有正则表达式处理的开销。 – Michael 2014-09-15 06:46:18
@Michael如果你愿意,你可以添加它作为另一个答案。或者我可以添加'string_to_array'作为我的选项,不知道我是如何错过的。 – 2014-09-16 04:53:24