我需要一个函数将字符串转换为仅字母数字字符...
意思是用空/空白替换(空)除了标准的 26 个字母和 10 个数字之外的所有其他字符。并用连字符替换所有空格。一个例子是这样的:
从
stack## overfl*w's s"te !s cool!
到
stack-overflws-ste-s-cool
有什么建议么?
我需要一个函数将字符串转换为仅字母数字字符...
意思是用空/空白替换(空)除了标准的 26 个字母和 10 个数字之外的所有其他字符。并用连字符替换所有空格。一个例子是这样的:
从
stack## overfl*w's s"te !s cool!
到
stack-overflws-ste-s-cool
有什么建议么?
您可以为此使用“XML 连接技巧”。您需要有一个从 1 到最长输入字符串长度的整数表。
-- The table Nums should have a column "n" with
-- integers from 1 to N, where N is at least as long as
-- the longest input string.
declare @T table (
id int,
s varchar(40)
);
insert into @T values
(1,'This *9--St ring.. '),
(2,'@#_that*8.3a--String..')
select
id,
(
select case when substring(s,n,1) = space(1) then '-' else substring(s,n,1) end
from Nums
where substring(s,n,1) like '[ a-zA-Z0-9]'
and n between 1 and datalength(s)
order by n
for xml path('')
) as S
from @T
Result:
id S
1 This-9St-ring-
2 that83aString
CREATE FUNCTION dbo.StripNonAlphaNumerics
(
@s VARCHAR(255)
)
RETURNS VARCHAR(255)
AS
BEGIN
DECLARE @p INT = 1, @n VARCHAR(255) = '', @c CHAR(1);
SET @s = REPLACE(@s, ' ', '-');
WHILE @p <= LEN(@s)
BEGIN
SET @c = SUBSTRING(@s, @p, 1);
IF @c = '-' OR @c LIKE '[A-Za-z0-9]'
BEGIN
SET @n += @c;
END
SET @p += 1;
END
RETURN(@n);
END
GO
用法:
SELECT dbo.StripNonAlphaNumerics('tether-45(;$&@- ip');
结果:
tether-45--ip
您可以使用“字符漫游器”概念,将原始字符串的每个字符连接到顺序整数表中。在此示例中,我们将最大长度限制为 80,但您当然可以根据需要使整数表变大。
declare @c table (i int);
declare @i int=1;
while @i<80 begin
insert into @c values(@i);
set @i+=1;
end
declare @str varchar(80)='stack## overfl*w''s s"te !s cool!';
declare @newstr varchar(80)='';
select @newstr+=replace(substring(@str,i,1),' ','-')
from @c
where substring(@str,i,1) like '[A-Za-z0-9 ]';
select @newstr;
结果:
stack-overflws-ste-s-cool
性能说明:此方法是我在工作中使用的一种方法,用于从转换项目中的遗留数据中清除坏字符。在该设置中,整数表被预先创建并由函数调用。整数表的i int
列上还定义了一个 PK。性能非常快。