需要更好的解决方案来删除特殊字符和数字

时间:2014-06-19 11:15:26

标签: sql sql-server sql-server-2008

有没有更好的方法来删除列中的所有特殊字符和数字,不限于一两个几乎删除所有特殊字符和数字。 截至目前我正在使用此查询(Jst Logic部分)。让我知道有没有更好的选择,因为我的表包含至少500万条记录

Declare @name varchar(1000) = '231323Lig%$%$h$%t'
Declare @dumy varchar(1000)

while(PATINDEX('%[0-9]%',@name)<>0)
    SET @name   = stuff(@name,PATINDEX('%[0-9]%',@name),1,'')


while(PATINDEX('%[A-Z]%',@name)<>0)
begin
    SET @dumy = isnull(@dumy,'')+substring(@name,PATINDEX('%[A-Z]%',@name),1)
    SET @name = stuff(@name,PATINDEX('%[A-Z]%',@name),1,'')
end

Set @name = @dumy

Select @name 'Clean'

2 个答案:

答案 0 :(得分:1)

  

尝试此功能:

Create Function [dbo].[RemoveNonAlphaCharacters](@Temp VarChar(1000))
Returns VarChar(1000)
AS
Begin

    Declare @KeepValues as varchar(50)
    Set @KeepValues = '%[^a-z]%'
    While PatIndex(@KeepValues, @Temp) > 0
        Set @Temp = Stuff(@Temp, PatIndex(@KeepValues, @Temp), 1, '')

    Return @Temp
End
  

这样称呼:

Select dbo.RemoveNonAlphaCharacters('231323Lig%$%$h$%t')

<强>输出:


Clean
Light

<强>更新

如果你想为整张桌子做这个就试试这个

Select dbo.RemoveNonAlphaCharacters(ColumnName),OtherColumn1,OtherColumn2 
FROM Table1

答案 1 :(得分:0)

您可以将功能简化为一个WHILE循环:

DECLARE @String NVARCHAR(MAX) = '231323Lig%$%$h$%t'
DECLARE @Expression NVARCHAR(32) = '%[^A-Z]%'

WHILE PATINDEX(@Expression, @String) > 0
    SET @String = STUFF(@String, PATINDEX(@Expression, @String), 1, '')

RETURN @String

CLR函数可能比纯T-SQL实现更快。

Regex.Replace(str, "[^a-zA-Z]+", "", RegexOptions.Compiled)