如何解决Oracle在出现特定字符后删除部分字符串
我试图在倒数第二个'_'字符之前获取一个字符串:
例如:
LORIK_BB_ID_FF_KKK_HUY_222_44
LUN_GGG_MAMA_FF_GG_GG_TT22_3
获取此部分(考虑到该字符串将始终具有四个或更多下划线,并且每个记录的下划线数量相同)
LORIK_BB_ID_FF_KKK_HUY
LUN_GGG_MAMA_FF_GG_GG
我已经尝试使用:
select SUBSTR('LORIK_BB_ID_FF_KKK_HUY',(INSTR ('LORIK_BB_ID_FF_KKK_HUY','_',-1)) - 1) from dual;
这个字符似乎在最后一次出现“ _”之前获得了每个字符,我似乎找不到找到在倒数第二个字符之前获得字符的解决方案。
解决方法
下划线可能会被计算REGEXP_COUNT(str,'_') - 1
次,而不是REGEXP_COUNT(str,'_') + 1
,后者是由下划线分隔的子字符串的数量,并通过使用LISTAGG(...,'_')...
函数将所有字符串连接起来,以使子字符串达到倒数第二个下划线:
WITH t(ID,str) AS
(
SELECT 1,'LORIK_BB_ID_FF_KKK_HUY_222_44' FROM dual UNION ALL
SELECT 2,'LUN_GGG_MAMA_FF_GG_GG_TT22_3' FROM dual
)
SELECT ID,LISTAGG(REGEXP_SUBSTR(str,'[^_]+',1,level),'_')
WITHIN GROUP (ORDER BY level) AS "Result String"
FROM t
CONNECT BY level <= REGEXP_COUNT(str,'_') - 1
AND PRIOR SYS_GUID() IS NOT NULL
AND PRIOR ID = ID
GROUP BY ID;
ID Result String
-- ----------------------
1 LORIK_BB_ID_FF_KKK_HUY
2 LUN_GGG_MAMA_FF_GG_GG
,
REGEXP_SUBSTR可用于使用组将字符串分为2部分。第一组是直到但不包括倒数第二个下划线的字符串,第二组是倒数第二个下划线,其余行直到末尾(允许在下划线之间包含任意数量的字符)。返回第一组。
<div class="someClass5 name product-group-5 ">I want to watch this click
</div>
<div class="someClass4 name product-group-1 ">not this
</div>
<div class="someClass3 name product-group-5 ">not this
</div>
<div class="someClass5 name product-group-5 another" style="display: block;"> And exclude this
</div>
,
为什么不尝试这样做:
select SUBSTR('LUN_GGG_MAMA_FF_GG_GG_TT22_3',(INSTR ('LUN_GGG_MAMA_FF_GG_GG_TT22_3','_',-1,2)) - 1) from dual;
select SUBSTR('LORIK_BB_ID_FF_KKK_HUY_222_44',(INSTR ('LORIK_BB_ID_FF_KKK_HUY_222_44',2)) - 1) from dual;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。