我曾经使用下面的查询将逗号分隔的字符串转换为行 -
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个元素最好的问候
答案 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