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
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.
我正在尝试获取倒数第二个“_”字符之前的字符串:
例如:
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
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.