-1

文字列を英数字のみに変換する関数が必要です...

意味は、標準の 26 文字と 10 個の数字以外のすべての文字を何もない/空白に置き換える (空にする) ことです。すべてのスペースをハイフンに置き換えます。例は次のようになります。

から

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

   stack-overflws-ste-s-cool

助言がありますか?

4

3 に答える 3

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 に答える
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 に答える
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 に答える