使用Oracle正则表达式将字符串(由连续分隔符分隔)转换为行
在Oracle中,我有一个由连续分隔符tilde~分隔的通用字符串。例如,字符串是“apple~ orange~~ mango~~ grapes”。需要将其转换为行,但需要注意的一点是分隔符是连续的波浪形而不是单个波浪形。输出应如下所示: 苹果橙 芒果 葡萄 解决方法已经使用instr和substr oracle函数完成,但我需要使用oracle正则表达式的更干净的解决方案。我已尝试使用以下查询,但未获得正确的解决方案:使用Oracle正则表达式将字符串(由连续分隔符分隔)转换为行,oracle,Oracle,在Oracle中,我有一个由连续分隔符tilde~分隔的通用字符串。例如,字符串是“apple~ orange~~ mango~~ grapes”。需要将其转换为行,但需要注意的一点是分隔符是连续的波浪形而不是单个波浪形。输出应如下所示: 苹果橙 芒果 葡萄 解决方法已经使用instr和substr oracle函数完成,但我需要使用oracle正则表达式的更干净的解决方案。我已尝试使用以下查询,但未获得正确的解决方案: WITH str AS (SELECT 'apple~orange~~ma
WITH str AS (SELECT 'apple~orange~~mango~~grapes' str FROM dual),
cnt AS (SELECT LEVEL sno FROM dual CONNECT BY LEVEL < 5)
SELECT regexp_substr (str, '[^~]+', 1, sno) FROM str CROSS JOIN cnt;
尝试此方法,您可以使用诸如*、^等任何字符作为实际值,如果您希望字符串中的任何字符都包含:
WITH STR AS (SELECT REPLACE('apple~orange~~mango~~grapes','~~',',') STR FROM DUAL),
CNT AS (SELECT LEVEL SNO FROM DUAL CONNECT BY LEVEL < 4)
SELECT REGEXP_SUBSTR (STR, '[^,]+', 1, SNO) FROM STR CROSS JOIN CNT;
试试这个
select
t.str
, regexp_substr (t.str, '[^~(?=~)]+', 1, rn) spl
from YOURTABLE t
cross
join (select rownum rn
from (select max (length (regexp_replace (t.str, '[^~~]+'))) + 1 mx
from YOURTABLE t
)
connect by level <= mx
)
where regexp_substr (t.str,'[^~(?=~)]+' , 1, rn) is not null)
你有头像吗?e、 g.您可以使用正则表达式“1个或多个前瞻~~失败的任何字符”,感谢您的响应,但分隔符不能少于两个字符,即~~并且我们不能将其替换为其他字符。如果delimeter可以是单字符的,那么我在查询中包含的sql可能已经工作了。这是因为数据可以包含任何字符,并且为了确保没有分隔符作为数据提供,我正在使用两个字符分隔符。@user2309418,您是否100%确定数据本身不会包含两个分隔符?感谢您的响应,但您粘贴的sql已经过尝试。如果您看到我最初的问题,我使用的sql与您提供的几乎相同。我面临的唯一问题是它没有返回基于两个字符分隔符的正确输出。我已经修改了答案,请检查一下好吗?嗨,我已经验证了,但仍然没有成功。
select
t.str
, regexp_substr (t.str, '[^~(?=~)]+', 1, rn) spl
from YOURTABLE t
cross
join (select rownum rn
from (select max (length (regexp_replace (t.str, '[^~~]+'))) + 1 mx
from YOURTABLE t
)
connect by level <= mx
)
where regexp_substr (t.str,'[^~(?=~)]+' , 1, rn) is not null)