逗号分隔的字符串列表[重复]

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 中的逗号)[重复]

PL/SQL 逗号分隔列表;删除重复并放入数组

在逗号分隔的字符串中[重复]

如何通过 Oracle 中的正则表达式从逗号分隔列表中删除重复项,但我不想要重复值? [复制]

逗号分隔的列表正则表达式 [重复]

从逗号分隔的 INT 字符串创建临时表 [重复]