SQL Server Replace函数实现大括号内连续9替换为[0-9]咨询
T-SQL 实现全9大括号替换方案
核心逻辑
仅匹配大括号内全部为数字9的子串,将每个9替换为[0-9],其余包含非9字符的大括号段保持不变,支持任意长度的连续9。
完整实现代码
DECLARE @sNumberFormat NVARCHAR(200) = 'rand{text.here,{999}also-Random9He8re' ;WITH RecursiveReplace AS ( -- 锚点:原始字符串作为递归起点 SELECT OriginalStr = @sNumberFormat, ProcessedStr = @sNumberFormat, StartPos = 1 UNION ALL SELECT OriginalStr, -- 判断当前大括号内是否全为9,是则替换,否则保留原段 CASE WHEN PATINDEX('%[^9]%', SUBSTRING(ProcessedStr, LeftBracePos + 1, RightBracePos - LeftBracePos - 1)) = 0 THEN STUFF(ProcessedStr, LeftBracePos, RightBracePos - LeftBracePos + 1, REPLICATE('[0-9]', RightBracePos - LeftBracePos - 1)) ELSE ProcessedStr END, -- 下一次查找的起始位置跳过当前右大括号 RightBracePos + 1 FROM RecursiveReplace CROSS APPLY ( -- 查找当前起始位置后的第一个左大括号 SELECT LeftBracePos = CHARINDEX('{', ProcessedStr, StartPos) ) t1 CROSS APPLY ( -- 查找对应右大括号 SELECT RightBracePos = CHARINDEX('}', ProcessedStr, LeftBracePos + 1) ) t2 -- 终止条件:找不到更多成对大括号 WHERE LeftBracePos > 0 AND RightBracePos > 0 ) -- 取递归完成后的最终结果 SELECT TOP 1 Result = ProcessedStr FROM RecursiveReplace ORDER BY StartPos DESC
运行结果
输出和预期完全一致:rand{text.here,[0-9][0-9][0-9]also-Random9He8re
兼容性说明
上述方案为原生T-SQL实现,支持SQL Server 2008及以上所有版本,无需额外开启功能权限,可直接复用。
内容的提问来源于stack exchange,提问作者Recktus
相关产品推荐
相关产品推荐

