用一个空格替换所有非字母数字和多个空白字符的函数



我正在尝试编写一个有效的函数,用于计算字段,它具有以下特征

  • 用空格
  • 替换所有非alpha数字字符
  • 将多个空格替换为空格
  • 修剪和降低结果

示例输入

A   B@#%$$C &^%D 

示例输出

a b c d

一个正常的正则表达式模式应该像这样匹配

[W_]+

以下工作,但我不确定是否有比使用2循环(O(n2)复杂度至少)更有效的方法与PatIndexStuff,charindexreplace

Create Function [dbo].[Clean](@Temp nvarchar(1000))
Returns nvarchar(1000)
AS
Begin
Declare @Pattern as varchar(50) = '%[^a-z0-9 ]%'
While PatIndex(@Pattern, @Temp) > 0
Set @Temp = Stuff(@Temp, PatIndex(@Pattern, @Temp), 1, ' ')
while charindex('  ',@Temp  ) > 0
set @Temp = replace(@Temp, '  ', ' ')
Return LOWER(TRIM(@Temp))
End

使用

Select dbo.Clean(' A   B@#%$$C &^%D ')

结果

a b c d

是否存在我可以使用的单一通道方法,或者我不知道的偷偷摸摸的方法?

我无法测试性能,但是下面的方法(没有循环并且基于一些字符串操作)是一个额外的选择。

请注意,您至少需要SQL Server 2017(用于TRANSLATE()调用)。

-- Input text and patterns
DECLARE @text varchar(1000) = ' A   B@#%$$C &^%D'
DECLARE @alphanumericpattern varchar(36) = 'abcdefghijklmnopqrstuvwxyz0123456789'
DECLARE @notalphanumericpattern varchar(1000) 
-- Trim and lower the input text
SELECT @text = RTRIM(LTRIM(LOWER(@text)))
-- Get not alpha-numeric characters
SELECT @notalphanumericpattern = 
REPLACE(
TRANSLATE(@text, @alphanumericpattern, REPLICATE('a', LEN(@alphanumericpattern))),
'a',
''
)
-- Replace all not alpha-numeric characters with a space
SELECT @text = 
REPLACE(
TRANSLATE(@text, @notalphanumericpattern, REPLICATE('$', LEN(@notalphanumericpattern))),
'$',
' '
)
-- Replace multiple spaces with a single space
SELECT @text =
REPLACE(
REPLACE(
REPLACE(
@text,
' ',
'<>'
),
'><',
''
),
'<>',
' '
)     

结果:

a b c d

最新更新