Oracle SQL如何截取字符串并去除最后一个下划线后的内容?
Oracle去除字符串最后一个下划线后的内容解决方案
针对你的需求,这里提供几种高效的实现方案,均适用于Oracle数据库的000_ABC_AXEL表:
方案1:使用SUBSTR + INSTR(非正则,性能更优)
通过反向查找最后一个下划线的位置,截取该位置之前的内容。同时处理字符串中无下划线的边界场景,返回原字符串。
SELECT col_name, CASE WHEN INSTR(col_name, '_', -1) > 0 THEN SUBSTR(col_name, 1, INSTR(col_name, '_', -1) - 1) ELSE col_name END AS processed_col FROM 000_ABC_AXEL;
说明:
INSTR(col_name, '_', -1):从字符串末尾开始查找第一个下划线的位置(索引从1开始计数)。SUBSTR(col_name, 1, 位置-1):截取从开头到目标下划线前一位的内容。CASE语句避免无下划线时返回空值,直接返回原字符串。
方案2:使用REGEXP_SUBSTR(正则表达式,写法简洁)
利用正则正向预查匹配最后一个下划线之前的所有内容:
SELECT col_name, NVL(REGEXP_SUBSTR(col_name, '^.*(?=_)'), col_name) AS processed_col FROM 000_ABC_AXEL;
说明:
- 正则
^.*(?=_):匹配从字符串开头到最后一个下划线之前的部分((?=_)为正向预查,不包含下划线本身)。 NVL函数处理无下划线的情况,此时正则匹配结果为NULL,直接返回原字符串。
方案3:使用REGEXP_REPLACE(替换法,最直观)
直接替换掉最后一个下划线及之后的所有内容:
SELECT col_name, REGEXP_REPLACE(col_name, '_[^_]*$', '') AS processed_col FROM 000_ABC_AXEL;
说明:
- 正则
_[^_]*$:匹配最后一个下划线(_)加上后续所有非下划线字符([^_]*)直到字符串结尾($)。 - 替换为空字符串后,自动保留最后一个下划线之前的内容;如果没有下划线,原字符串不会被修改。
测试验证
假设col_name字段的值为a_222_4、123_xyz_0、test_nounderscore,以上三种方案返回结果分别为:
a_222、123_xyz、test_nounderscore
内容的提问来源于stack exchange,提问作者SQL_DE
相关产品推荐
相关产品推荐

