Oracle 在特定字符出现后删除部分字符串

Oracle Remove part of string after a specific occurrence of a character

我正在尝试获取倒数第二个“_”字符之前的字符串:

例如:

 LORIK_BB_ID_FF_KKK_HUY_222_44
 LUN_GGG_MAMA_FF_GG_GG_TT22_3

获取这部分(考虑到字符串会总是有4个或更多的下划线并且每条记录的下划线数量相同):

LORIK_BB_ID_FF_KKK_HUY
LUN_GGG_MAMA_FF_GG_GG

我已经尝试使用:

select SUBSTR('LORIK_BB_ID_FF_KKK_HUY',0, (INSTR ('LORIK_BB_ID_FF_KKK_HUY', '_', -1)) - 1) from dual;

这个似乎获取了最后一次出现'_'之前的所有字符,我似乎找不到解决方案来获取倒数第二个下划线之前的字符。

为什么你不尝试这个:

 select SUBSTR('LUN_GGG_MAMA_FF_GG_GG_TT22_3',0, (INSTR ('LUN_GGG_MAMA_FF_GG_GG_TT22_3', '_', -1, 2)) - 1) from dual;

select SUBSTR('LORIK_BB_ID_FF_KKK_HUY_222_44',0, (INSTR ('LORIK_BB_ID_FF_KKK_HUY_222_44', '_', -1, 2)) - 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

Demo

REGEXP_SUBSTR 可用于使用组将字符串分成两部分。第一组是直到但不包括倒数第二个下划线的字符串,第二组是倒数第二个下划线和该行的其余部分直到结尾(允许下划线之间有任意数量的字符)。 Return第一组

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,
REGEXP_SUBSTR(str, '(.*)(_.*_.*$)', 1, 1, NULL, 1) mystring
from t;

        ID MYSTRING                     
---------- -----------------------------
         1 LORIK_BB_ID_FF_KKK_HUY       
         2 LUN_GGG_MAMA_FF_GG_GG        

2 rows selected.