-1

我需要一个函数将字符串转换为仅字母数字字符...

意思是用空/空白替换(空)除了标准的 26 个字母和 10 个数字之外的所有其他字符。并用连字符替换所有空格。一个例子是这样的:

   stack## overfl*w's s"te !s cool!

   stack-overflws-ste-s-cool

有什么建议么?

4

3 回答 3

2

您可以为此使用“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
于 2012-04-23T02:04:17.707 回答
2
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
于 2012-04-23T02:58:17.117 回答
1

您可以使用“字符漫游器”概念,将原始字符串的每个字符连接到顺序整数表中。在此示例中,我们将最大长度限制为 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。性能非常快。

于 2012-04-23T01:54:22.770 回答