使用SQL提取文件名中第一与第二个下划线间内容的最佳方法
SQL提取文件名指定片段的最佳方案
核心需求是提取第一个和第二个下划线之间的不定长内容,不管内容是数字还是字母都能适配,下面分不同场景给出实现:
通用兼容方案(适配所有SQL数据库,无需正则支持)
核心逻辑是通过内置函数定位两个下划线的位置,再截取中间内容,兼容性最高,不会出现方言不兼容问题:
MySQL、PostgreSQL、Hive、Spark SQL写法
假设存储文件名的字段为file_name,表名为your_table:
SELECT SUBSTRING( file_name, -- 第一个下划线的下一个位置作为截取起点 INSTR(file_name, '_') + 1, -- 第二个下划线和第一个下划线的差值作为截取长度 INSTR(SUBSTRING(file_name, INSTR(file_name, '_') + 1), '_') - 1 ) AS target_segment FROM your_table;
SQL Server写法
SELECT SUBSTRING( file_name, CHARINDEX('_', file_name) + 1, CHARINDEX('_', file_name, CHARINDEX('_', file_name) + 1) - CHARINDEX('_', file_name) - 1 ) AS target_segment FROM your_table;
简化正则方案(适配支持正则函数的SQL环境)
如果你的数据库支持正则提取,可以用更简洁的写法,直接匹配目标片段:
-- 适配MySQL8.0+、PostgreSQL、Oracle SELECT REGEXP_SUBSTR(file_name, '^[^_]+_([^_]+)_', 1, 1, NULL, 1) AS target_segment FROM your_table;
正则说明:^[^_]+_([^_]+)_会从字符串开头匹配到第一个下划线,再捕获后续到第二个下划线之间的所有非下划线字符,直接返回捕获组内容,无需手动计算位置。
异常处理建议
如果存在不符合通用格式的文件名,可以加过滤条件避免返回空值或报错:
WHERE file_name LIKE '%\_%\_%' ESCAPE '\'
内容的提问来源于stack exchange,提问作者A88
相关产品推荐
相关产品推荐

