Требуется лучшее решение для удаления специальных символов и чисел

#sql #sql-server #sql-server-2008

#sql #sql-сервер #sql-server-2008

Вопрос:

Есть ли лучший способ удалить все специальные символы и цифры в столбце, не ограничиваясь одним или двумя, чтобы удалить все специальные символы и цифры. На данный момент я использую этот запрос (логическая часть Jst). Дайте мне знать, есть ли лучший выбор, поскольку моя таблица содержит минимум 5 миллионов записей

 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'
  

Ответ №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. Спасибо, это хорошо, поскольку это таблица, я не могу передать все записи в функцию, можете ли вы предоставить мне решение, чтобы сделать это сразу для всей таблицы.

2. @user3751754- Да, вы можете сделать это для всей таблицы. Смотрите мой обновленный ответ. Отметьте ответ, если это помогло вам

Ответ №2:

Вы можете упростить свою функцию до одного цикла 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)