SQL Server 2016 REPLACE函数无法精确匹配,表现类似LIKE模糊匹配
问题解决说明
REPLACE函数默认执行子串全匹配,只要字符串中包含目标子串就会触发替换,你需要替换的SOB40是SOB400的前缀,所以会误匹配SOB400的前半部分,替换后遗留多余的0。
针对你的场景有两种可行的解决方案:
方案1:匹配完整边界(适配你当前的字符串结构)
观察你提供的JSON结构,SOB40后固定紧跟],你可以补全匹配边界避免误命中,只需修改你的REPLACE语句即可:
DECLARE @x varchar(max) = '[{"propertyName":"Test","propertyValue":"12345"}]', @y varchar(max) = '{{"sNumber":40,"name":"bush","description":"bush","suggested":["nnm"],"Names":["676"],"behaviors":["uy"],"documents":[],"propertyValues":[{ "propertyName": "OPs", "propertyValue": "08/26 13:22" },SOB40]},{"sNumber":400,"name":"as","description":"u","Names":["jll"],"documents":"5656","propertyValues":[{ "propertyName": "nn", "propertyValue": "01/05 12:59" },SOB400]}}' -- 仅修改REPLACE的匹配和替换内容,补全]边界 SELECT @x = REPLACE(@y, ',SOB40]', ',' + SUBSTRING(@x, 2, LEN(@x) - 2) + ']') SELECT @x
方案2:通用长短串占位替换(不依赖字符串结构)
如果后续SOB40后可能跟其他字符,可使用「长串先占位→替换短串→还原长串」的逻辑,不需要依赖正则函数:
DECLARE @x varchar(max) = '[{"propertyName":"Test","propertyValue":"12345"}]', @y varchar(max) = '{{"sNumber":40,"name":"bush","description":"bush","suggested":["nnm"],"Names":["676"],"behaviors":["uy"],"documents":[],"propertyValues":[{ "propertyName": "OPs", "propertyValue": "08/26 13:22" },SOB40]},{"sNumber":400,"name":"as","description":"u","Names":["jll"],"documents":"5656","propertyValues":[{ "propertyName": "nn", "propertyValue": "01/05 12:59" },SOB400]}}', @tempPlaceholder varchar(50) = 'TEMP_SOB400_PLACEHOLDER' -- 第一步:将SOB400替换为临时占位符,避免被误匹配 SET @y = REPLACE(@y, 'SOB400', @tempPlaceholder) -- 第二步:替换目标串SOB40 SET @y = REPLACE(@y, ',SOB40', ',' + SUBSTRING(@x, 2, LEN(@x) - 2)) -- 第三步:将占位符还原为SOB400 SET @x = REPLACE(@y, @tempPlaceholder, 'SOB400') SELECT @x
两种方案都可以完全避免误替换SOB400的问题,不需要额外安装自定义函数。
内容的提问来源于stack exchange,提问作者user6255719
相关产品推荐
相关产品推荐

