将分隔的字符串转换为oracle中的行

时间:2017-08-14 10:43:44

标签: sql oracle oracle11g oracle12c

我曾经使用下面的查询将逗号分隔的字符串转换为行 -

select regexp_substr('A,B,C,D','[^,]+', 1, level) from dual
connect by regexp_substr('A,B,C,D', '[^,]+', 1, level) is not null;

但是,现在我的分隔符是 - '〜^'

我无法对此分隔符使用相同的查询。

select regexp_substr('A~^B~^C~D^E','[^~^]+', 1, level) from dual
    connect by regexp_substr('A~^B~^C~D^E', '[^~^]+', 1, level) is not null;

我期待 -

A
B
C~D^E

请帮忙

如果提供的分隔符是〜^

,则可能是第n个元素

最好的问候

3 个答案:

答案 0 :(得分:2)

匆匆离开this method for splitting a string while allowing for nulls

select regexp_substr('A~^B~^C~D^E','(.*?)(~\^|$)', 1, level, null, 1) from dual
connect by level < regexp_count('A~^B~^C~D^E','(.*?)(~\^|$)');

REGEXP_SUBS
-----------
A
B
C~D^E

在链接的答案中,它会查找任何字符,非贪婪,然后是~^(插入符号转义,~\^)或行尾的组合。 regexp_substr()还调用uses the optional arguments来指定subexpr - 所以它只获得第一个分组(.*?),而不是第二个分组中的分隔符本身。

如果你想要一个特定的元素,那就更接近链接的帖子了:

select regexp_substr('A~^B~^C~D^E','(.*?)(~\^|$)', 1, 3, null, 1) from dual;

REGEX
-----
C~D^E

或者,当您在某个过程中执行此操作时,请使用connect-by查询填充集合,然后选择所需的元素(如果您要查看多个元素)。 / p>

答案 1 :(得分:1)

我无法使用正则表达式功能 - 太难了!这个定制功能怎么样?

create or replace function test (p_str varchar2, p_delim varchar2)
  return SYS.KU$_VCNT -- handy table of VARCHAR2(4000) in SYS
is
  l_str long := p_str;
  l_ret SYS.KU$_VCNT := SYS.KU$_VCNT();
begin
  while instr (l_str, p_delim) > 0 loop
    l_ret.extend;
    l_ret(l_ret.count) := substr(l_str, 1, instr (l_str, p_delim)-1);
    l_str := substr (l_str, instr (l_str, p_delim)+2);
  end loop;
  if l_str is not null then
    l_ret.extend;
    l_ret(l_ret.count) := l_str;
  end if;
  return l_ret;
end;

然后:

select * from table (test('A~^B~^C~D^E','~^'));

A
B
C~D^E

第n个元素(例如第2个):

select column_value from
(select column_value, rownum n from table (test('A~^B~^C~D^E','~^')))
where n = 2;

答案 2 :(得分:0)

嗯。嗯。 。 。这非常接近:

select regexp_substr('A~^B~^C~D^E', '([^~]|[~][^^])+', 1, level) from dual
    connect by regexp_substr('A~^B~^C~D^E', '([^~]|[~][^^])+', 1, level) is not null

你可以通过以下方式摆脱^

select regexp_replace(regexp_substr('A~^B~^C~D^E', '([^~]|[~][^^])+', 1, level), '^\^', '') from dual
    connect by regexp_substr('A~^B~^C~D^E', '([^~]|[~][^^])+', 1, level) is not null