我正在尝试编写一个有效的函数,用于计算字段,它具有以下特征
- 用空格 替换所有非alpha数字字符
- 将多个空格替换为空格
- 修剪和降低结果
示例输入
A B@#%$$C &^%D
示例输出
a b c d
一个正常的正则表达式模式应该像这样匹配
[W_]+
以下工作,但我不确定是否有比使用2循环(O(n2)复杂度至少)更有效的方法与PatIndex
和Stuff
,charindex
和replace
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