我有逗號柱分離數據這怎麼能實現?拆分逗號分隔的列數據到其他列
回答
如果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