Oracle

时间:2017-09-05 09:21:42

标签: oracle

如果我在查询下面运行,

select REGEXP_SUBSTR('->Total PCAT-Reporting->FSP->FSP->FSP->FSP-Non Partner->Default','[^->]+')
from dual

我得到 - Total PCAT作为结果。

但我想要Total PCAT-Reporting因为这是整个第一个字符串。

如何获得理想的结果?我不能做任何硬编码。

我尝试过以下查询,

select REGEXP_SUBSTR(REGEXP_REPLACE('->Total PCAT-Reporting->FSP->FSP->FSP->FSP-Non Partner->Default','-',''),'[^->]+')
from dual

这给了Total PCATReporting,但我也想要连字符。

3 个答案:

答案 0 :(得分:0)

您可以使用单个regexp_replace执行此操作,如下所示:

select regexp_replace('->Total PCAT-Reporting->FSP->FSP->FSP->FSP-Non Partner->Default', '->(.+?)->.*', '\1') new_str
from   dual;

NEW_STR
--------------------
Total PCAT-Reporting

这使用非贪婪搜索来查找->之间的任何字符,然后将其替换为第一个括号中的表达式 - ->之间的字符。

答案 1 :(得分:0)

您可以使用非贪婪的 REGEXP_SUBSTR 来捕获所需的文本,然后通过 REGEXP_REPLACE

删除不必要的字符
SELECT REGEXP_REPLACE(REGEXP_SUBSTR('->Total PCAT-Reporting->FSP->FSP->FSP->FSP-Non Partner->Default','[^->].+?((->)|$)', 1, 1), '->$', '')
FROM  DUAL

答案 2 :(得分:0)

如果您能够将两个字符字段分隔符更改为一个(一个不会出现在字符串中的分隔符),则可以使用原始的REGEXP_SUBSTR。 select REGEXP_SUBSTR(str,'[^~]+' ,1,1),REGEXP_SUBSTR(str,'[^~]+' ,1,2),REGEXP_SUBSTR(str,'[^~]+' ,1,3) /*etc*/ from( select regexp_replace('->Total PCAT-Reporting->FSP1->FSP2->FSP->FSP-Non Partner->Default', '->', '~') str from dual )