You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 21:55:42