SQL Server如何用正则/PatIndex删除单引号间少于5字符的内容
问题原因
你目前使用的fn_StripCharacters函数本身逻辑是单个字符匹配删除,函数内部会把你传入的匹配规则包在[]字符集语法里,所以你传入的'/^''PC''$/'会被解析为「匹配删除所有/、^、'、P、C、$单个字符」,完全达不到匹配整个'PC'子串的需求,更没法判断单引号包裹内容的长度。
推荐解决方案(SQL Server 2016及以上版本)
直接用字符串拆分+过滤+合并的逻辑实现,不需要依赖原有自定义函数,逻辑更清晰稳定:
SELECT STRING_AGG(QUOTENAME(value, ''''), ',') FROM STRING_SPLIT(REPLACE(你的字段名, '''', ''), ',') WHERE LEN(value) >=5
逻辑说明:
- 先把原字符串的单引号全部去除,再按逗号拆分出每个独立的项
- 过滤出字符长度≥5的项
- 给符合要求的项重新包裹单引号,再用逗号拼接为最终字符串
低版本SQL Server适配方案
如果你的SQL Server版本低于2016,没有原生的STRING_SPLIT和STRING_AGG函数,可以先自定义拆分字符串的表值函数:
CREATE FUNCTION dbo.SplitString ( @String NVARCHAR(MAX), @Delimiter CHAR(1) ) RETURNS @Result TABLE (Value NVARCHAR(MAX)) AS BEGIN DECLARE @Pos INT WHILE CHARINDEX(@Delimiter, @String) > 0 BEGIN SET @Pos = CHARINDEX(@Delimiter, @String) INSERT INTO @Result (Value) VALUES (LEFT(@String, @Pos - 1)) SET @String = RIGHT(@String, LEN(@String) - @Pos) END INSERT INTO @Result (Value) VALUES (@String) RETURN END
再执行查询实现需求:
SELECT STUFF(( SELECT ',' + QUOTENAME(REPLACE(Value, '''', ''), '''') FROM dbo.SplitString(你的字段名, ',') WHERE LEN(REPLACE(Value, '''', '')) >=5 FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
内容的提问来源于stack exchange,提问作者Lee
相关产品推荐
相关产品推荐

