逗号分隔的字符串列表[重复]
Posted
技术标签:
【中文标题】逗号分隔的字符串列表[重复]【英文标题】:Comma separated string to list [duplicate] 【发布时间】:2017-02-14 12:29:52 【问题描述】:我有一个字符串,其值如下:
Countries = USA, Canada, Italy
我想将它们分开并显示为如下列表
Countries
USA
Canada
Italy
如何使用 SQL 来做到这一点?
【问题讨论】:
@a_horse_with_no_name 这个问题不是这个问题的重复 - 是的,最初的部分是相似的,但是那个问题的 OP 想要对项目进行分组和计数 - 接受的答案会产生太多的行正确回答这个问题,然后使用获取COUNT()
忽略NULL
值的技巧来获得该问题的答案。是的,这可能应该作为副本关闭,但不能与该目标一起关闭。
更好的副本(但我们无法链接到文档页面):***.com/documentation/oracle/1968/…
另一个重复 - ***.com/questions/17419160/…
@MT0:如果不付出努力,复制可能无关紧要。 “太宽泛”很好——我们需要养成鼓励 OP 努力的习惯,并教导我们不是众包搜索引擎。
@halfer 我认为这确实很重要 - 不是为了这个问题的 OP(谁应该在发布之前做尽职调查),而是为了将来发现这个问题的人,认为他们已经进行了尽职调查,并花时间试图让链接的问题做他们想做的事,却发现它并不能完全回答这个问题。
【参考方案1】:
Oracle 文档页面的Splitting Delimited Strings 主题中发布了多个解决方案。
一个是:
样本数据:
CREATE TABLE table_name ( id, list ) AS
SELECT 1, 'a,b,c,d' FROM DUAL UNION ALL -- Multiple items in the list
SELECT 2, 'e' FROM DUAL UNION ALL -- Single item in the list
SELECT 3, NULL FROM DUAL UNION ALL -- NULL list
SELECT 4, 'f,,g' FROM DUAL; -- NULL item in the list
查询:
SELECT t.id,
v.COLUMN_VALUE AS value,
ROW_NUMBER() OVER ( PARTITION BY id ORDER BY ROWNUM ) AS lvl
FROM table_name t,
TABLE(
CAST(
MULTISET(
SELECT REGEXP_SUBSTR( t.list, '([^,]*)(,|$)', 1, LEVEL, NULL, 1 )
FROM DUAL
CONNECT BY LEVEL < REGEXP_COUNT( t.list, '[^,]*(,|$)' )
)
AS SYS.ODCIVARCHAR2LIST
)
) v;
输出:
ID ITEM LVL
---------- ------- ----------
1 a 1
1 b 2
1 c 3
1 d 4
2 e 1
3 (NULL) 1
4 f 1
4 (NULL) 2
4 g 3
【讨论】:
【参考方案2】:您可以使用 regex_substr 和 connect by
select regexp_substr( 'USA, Canada, Italy','[^,]+', 1, level) from dual
connect by regexp_substr('USA, Canada, Italy', '[^,]+', 1, level) is not null;
【讨论】:
但这些国家并非一直都是静态的......它可能会在用户上更改为另一个......顺便说一句“-员工自定义属性”。TEXT_0是我的专栏标题。我想用逗号分隔符显示此列中的任何值以列出。谢谢, 这仅适用于单行数据 - 当有多个输入行时,CONNECT BY
子句将开始跨行生成连接,并且会生成很多很多重复行。
以上是关于逗号分隔的字符串列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章
拆分由逗号分隔的 JSON blob 列表(忽略 JSON blob 中的逗号)[重复]