小编典典

在Oracle中将定界字符串转换为行

sql

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

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个元素

最好的祝福


阅读 189

收藏
2021-04-07

共1个答案

小编典典

简化此方法以拆分字符串,同时允许null:

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()电话还采用了可选的参数指定subexpr-所以只得到了第一组(.*?),而不是分隔符本身,这是在第二组。

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

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

REGEX
-----
C~D^E

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

2021-04-07