如何用SUBSTRING和CHARINDEX提取文件名中的text4及text5文本块?
解决方案:提取文件名中的text4和text5文本块
你的文件名格式为ab123_text1_text2_text3_text4_text5_.xlsx,以下划线分隔为多个模块。原始代码仅通过两次嵌套CHARINDEX定位了第2、3个下划线之间的内容(即text3),要提取text4和text5需要调整嵌套层数,精准定位目标模块前后的下划线位置。
提取text4的SQL代码
SELECT SUBSTRING( FILENAME, -- 定位第4个下划线的位置,加1作为截取起始点 CHARINDEX('_', FILENAME, CHARINDEX('_', FILENAME, CHARINDEX('_', FILENAME, CHARINDEX('_', FILENAME) + 1) + 1) + 1) + 1, -- 计算截取长度:第5个下划线位置 - 第4个下划线位置 - 1 CHARINDEX('_', FILENAME, CHARINDEX('_', FILENAME, CHARINDEX('_', FILENAME, CHARINDEX('_', FILENAME, CHARINDEX('_', FILENAME) + 1) + 1) + 1) + 1) - CHARINDEX('_', FILENAME, CHARINDEX('_', FILENAME, CHARINDEX('_', FILENAME, CHARINDEX('_', FILENAME) + 1) + 1) + 1) - 1 ) AS text4 FROM mytable
提取text5的SQL代码
SELECT SUBSTRING( FILENAME, -- 定位第5个下划线的位置,加1作为截取起始点 CHARINDEX('_', FILENAME, CHARINDEX('_', FILENAME, CHARINDEX('_', FILENAME, CHARINDEX('_', FILENAME, CHARINDEX('_', FILENAME) + 1) + 1) + 1) + 1) + 1, -- 计算截取长度:第6个下划线位置 - 第5个下划线位置 - 1 CHARINDEX('_', FILENAME, CHARINDEX('_', FILENAME, CHARINDEX('_', FILENAME, CHARINDEX('_', FILENAME, CHARINDEX('_', FILENAME, CHARINDEX('_', FILENAME) + 1) + 1) + 1) + 1) + 1) - CHARINDEX('_', FILENAME, CHARINDEX('_', FILENAME, CHARINDEX('_', FILENAME, CHARINDEX('_', FILENAME, CHARINDEX('_', FILENAME) + 1) + 1) + 1) + 1) - 1 ) AS text5 FROM mytable
更易读的分步写法(推荐)
通过CTE分步计算每个下划线的位置,避免多层嵌套的可读性问题:
WITH FileNamePositions AS ( SELECT FILENAME, CHARINDEX('_', FILENAME) AS pos1, -- 第1个下划线位置 CHARINDEX('_', FILENAME, pos1 + 1) AS pos2, -- 第2个下划线位置 CHARINDEX('_', FILENAME, pos2 + 1) AS pos3, -- 第3个下划线位置 CHARINDEX('_', FILENAME, pos3 + 1) AS pos4, -- 第4个下划线位置 CHARINDEX('_', FILENAME, pos4 + 1) AS pos5, -- 第5个下划线位置 CHARINDEX('_', FILENAME, pos5 + 1) AS pos6 -- 第6个下划线位置 FROM mytable ) SELECT SUBSTRING(FILENAME, pos4 + 1, pos5 - pos4 - 1) AS text4, SUBSTRING(FILENAME, pos5 + 1, pos6 - pos5 - 1) AS text5 FROM FileNamePositions
内容的提问来源于stack exchange,提问作者GreyFox9881
相关产品推荐
相关产品推荐

