如何提取href列中最后一个下划线与文件扩展名之间的内容
解法思路
你之前的写法仅实现了提取文件后缀的功能,没有完成核心的名称与版本号拆分逻辑,完整处理逻辑如下:
- 先去除
href字段末尾的文件后缀(即最后一个.及之后的所有内容),得到无后缀的基础字符串 - 定位基础字符串中最后一个下划线
_的位置,按这个位置拆分内容:- 如果下划线在基础字符串的末尾,直接去掉末尾下划线作为
name,rev留空 - 否则下划线前的内容为
name,下划线后的内容为rev
- 如果下划线在基础字符串的末尾,直接去掉末尾下划线作为
参考SQL实现(PostgreSQL环境)
SELECT href, -- 计算name字段 CASE WHEN STRPOS(REVERSE(base_str), '_') = 1 THEN LEFT(base_str, -1) ELSE LEFT(base_str, LENGTH(base_str) - STRPOS(REVERSE(base_str), '_')) END AS name, -- 计算rev字段 CASE WHEN STRPOS(REVERSE(base_str), '_') = 1 THEN '' ELSE RIGHT(base_str, STRPOS(REVERSE(base_str), '_') - 1) END AS rev FROM ( -- 先去除文件后缀得到基础字符串 SELECT href, REGEXP_REPLACE(href, '\.[^.]+$', '') AS base_str FROM 你的表名 ) AS temp
其他数据库适配
如果使用MySQL等其他数据库,仅需要调整对应函数名即可:
- 将
LENGTH替换为CHAR_LENGTH/LENGTH - 不支持
REGEXP_REPLACE的场景下,可以用你之前的反向拆分逻辑替换基础字符串计算语句:REVERSE(SUBSTRING(REVERSE(href), LOCATE('.', REVERSE(href)) + 1)) AS base_str
所有逻辑完全匹配你给出的示例数据,可直接测试使用。
内容的提问来源于stack exchange,提问作者user15973370
相关产品推荐
相关产品推荐

