2017-02-14 146 views
-2

我有作为值如下字符串:逗号分隔字符串列表

Countries = USA, Canada, Italy 

我想它们分开,并显示为列表类似下面

Countries 
USA 
Canada 
Italy 

我该怎么做使用SQL?

+0

@a_horse_with_no_name这个问题不是这个问题的重复 - 是的,最初的部分是相似的,但是那个问题的OP想要对项目进行分组和计数 - 接受的答案会生成太多的行来正确回答这个问题然后使用'COUNT()'来忽略NULL值来获得该问题的答案。是的,这可能应该作为重复关闭,但不能与该目标关联。 – MT0

+0

更好的重复(但我们无法链接到文档页面):http://stackoverflow.com/documentation/oracle/1968/splitting-delimited-strings#t=201702141232438006307 – MT0

+0

另一个重复 - http:// stackoverflow。 com/questions/17419160/connect-by-to-generate-rows-from-multiple-delimited-string – MT0

回答

0

您可以通过

select regexp_substr('USA, Canada, Italy','[^,]+', 1, level) from dual 
    connect by regexp_substr('USA, Canada, Italy', '[^,]+', 1, level) is not null; 
+0

但国家并非一直是静态的......它可能会改变用户到另一个.. 顺便说一句“ - 员工自定义属性”.TEXT_0是我的colomn标题。 我想用逗号分隔符显示这个列表中的任何值。 谢谢, –

+0

这只适用于单行数据 - 当存在多个输入行时,'CONNECT BY'子句将开始在行之间生成连接,并且会生成许多许多重复的行。 – MT0

1

使用regex_substr和连接有发布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