SQL Server中如何替换倒数第二个横杠后的指定内容?
解决SQL字符串替换最后两个横杠间内容的问题
嘿,这个需求其实不用发愁,用SQL里的字符串函数组合就能轻松实现,我给你两种实用的方案,你可以根据自己的SQL版本来选:
方法一:反向定位法(兼容多数SQL Server版本)
这种方法不用依赖高版本的新函数,靠基础的字符串操作就能搞定,思路是先定位最后两个横杠的位置,再把中间的内容替换掉:
DECLARE @test VARCHAR(50) = 'F-1084-002-04-009' DECLARE @replaceVal VARCHAR(2) = '00' -- 先把字符串倒过来,找最后一个横杠在原字符串里的反向位置 DECLARE @lastDashPos INT = CHARINDEX('-', REVERSE(@test)) -- 再找倒数第二个横杠的反向位置 DECLARE @secondLastDashPos INT = CHARINDEX('-', REVERSE(@test), @lastDashPos + 1) -- 拼接最终结果:保留前面的部分 + 替换值 + 保留最后一段 SELECT LEFT(@test, LEN(@test) - @secondLastDashPos) + @replaceVal + RIGHT(@test, @lastDashPos - 1) AS ModifiedString
简单说下逻辑:把字符串反转后,原来的最后两个横杠就变成了开头的两个横杠,这样用CHARINDEX就能轻松找到它们的位置,再通过长度计算出原字符串里需要保留的前后段,最后把替换值插进去就行。
方法二:拆分重组法(SQL Server 2016及以上适用)
如果你的SQL Server版本支持STRING_SPLIT和STRING_AGG这两个函数,那可以用更直观的拆分-修改-重组思路:
DECLARE @test VARCHAR(50) = 'F-1084-002-04-009' DECLARE @replaceVal VARCHAR(2) = '00' WITH SplitParts AS ( SELECT value, -- 给拆分后的每一段编号 ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS PartNumber FROM STRING_SPLIT(@test, '-') ) SELECT -- 把各段拼回去,第4段替换成目标值 STRING_AGG(CASE WHEN PartNumber = 4 THEN @replaceVal ELSE value END, '-') AS ModifiedString FROM SplitParts
这个方法更易懂:先把字符串按横杠拆分成独立的片段,给每个片段编上号(这里原字符串是5段,要替换的是第4段),然后用CASE语句把第4段换成00,最后再用STRING_AGG把所有片段拼回成完整的字符串。
两种方法都能得到你想要的结果:F-1084-002-00-009,选哪种就看你的环境啦~
内容的提问来源于stack exchange,提问作者JJ.
相关产品推荐
相关产品推荐

