如果值本身包含逗号,如何在SQL查询中解析逗号分隔的字符串

时间:2014-11-25 14:32:08

标签: sql string oracle parsing comma

我有一个表T1,它有一个VARCHAR2列C1。 列C1可以具有诸如John' Jimmy,Marco' Daniel' Robert,Wayne'之类的值。等等 请注意,该值本身可以使用逗号。

我必须构造一个SQL查询或函数,它接受这些名称的单个字符串并输出不同行中的名称。

E.g    输入字符串:Daniel,Jimmy,Marco,John

输出行:丹尼尔                  吉米,马尔科                  约翰

我尝试使用以下查询但如果值本身有逗号则失败。 但是,如果我在输入字符串的值中没有任何逗号,则它可以正常工作。

select C1 from T1 where C1 in
(select str from
  (SELECT REGEXP_SUBSTR ('input string', '[^,]+', 1, LEVEL) as str FROM dual
         CONNECT BY LEVEL <= (select LENGTH (REPLACE ('input string', ',', NULL)) from dual))
)

1 个答案:

答案 0 :(得分:0)

您必须以某种方式指定要忽略的逗号。那么可以用双引号将它们括起来吗? 如果是这样,以下查询可能适合您。

示例输入:

Suresh,"Rajesh,Ramesh"

输出

Suresh
Rajesh Ramesh

<强>查询:

with my_data(names) as
( 
  select 'Mahesh' as str from dual
  union all
  select '"Vignesh,Ganesh"' from dual
  union all
  select 'Suresh,"Rajesh,Ramesh"' from dual
  union all
  select 'Tamanna' from dual
),
my_data_stripped(names) as
(
SELECT REPLACE(regexp_replace(names,'(")([^"|,]+)(,)([^"]+)(")','\1\2 \4\5'),'"') FROM MY_DATA
)
SELECT REGEXP_SUBSTR(names,'[^,]+',1,LEVEL) AS test
  FROM my_data_stripped
CONNECT BY REGEXP_SUBSTR(names,'[^,]+',1,LEVEL) IS NOT NULL
   AND PRIOR names = names
   AND PRIOR sys_guid() IS NOT NULL;

<强>结果:

TEST
-----------------
Mahesh
Suresh
Rajesh Ramesh
Tamanna
Vignesh Ganesh