Удалить номера из строки SQL Server

У меня есть большая база данных, в которой я хочу выполнить поиск строки детали. Пользователь будет вводить символы:JoeBloggs.

Ради аргументов, если бы у меня было имяJoe 23 Blo Ggs 4 в базе данных. Я хочу удалить все в имени, кроме A-Z.

у меня естьREPLACE(Name, ' ','') функция для удаления пробелов и томуUPPER() функция для заглавной буквы имени.

Есть ли более эффективный быстрый способ, может быть, с помощью регулярных выражений заменить что-либо, кроме A-Z. Я не могу изменить значения в базе данных.

заранее спасибо

 CR41G1405 нояб. 2012 г., 22:19
@DmitryVyakhirev - Там могут быть такие символы, как ' " @ /, это грязная база данных, поэтому мне нужно будет сделать несколько замен, чтобы избавиться от каждого случая плохого персонажа
 CR41G1405 нояб. 2012 г., 22:07
@ Laurence - Да, я полагаю, что могу сделать это, но можем ли мы сделать это во временной таблице в хранимой процедуре? Если нет, то я могу запросить этот вычисляемый столбец, все, что мне нужно, это функция, чтобы сделать замену. Спасибо за ваш быстрый ответ
 vyakhir05 нояб. 2012 г., 22:13
Не рекомендую использовать регулярные выражения, если производительность имеет значение. То, как вы используете, очевидно, но все же хорошо!
 Laurence05 нояб. 2012 г., 22:04
Вы говорите, что можетеизменить данные. Можете ли вы добавить вычисляемый столбец в существующую таблицу? Или добавить новую таблицу с внешним ключом и вашим вычисленным значением?

Ответы на вопрос(6)

Попробуйте ниже для вашего запроса. где val - это имя вашей строки или столбца.

CASE WHEN PATINDEX('%[a-z]%', REVERSE(val)) > 1
                THEN LEFT(val, LEN(val) - PATINDEX('%[a-z]%', REVERSE(val)) + 1)
            ELSE '' END
 KoalaBear10 дек. 2018 г., 07:56
мы заменилиELSE '' END сELSE val END поэтому он также возвращается, когда в нем нет чисел.

Не проверено, но вы можете сделать что-то вроде этого:

Create Function dbo.AlphasOnly(@s as varchar(max)) Returns varchar(max) As
Begin
  Declare @Pos int = 1
  Declare @Ret varchar(max) = null
  If @s Is Not Null
  Begin
    Set @Ret = ''
    While @Pos 
 Laurence05 нояб. 2012 г., 23:45
Если вы настаиваете на выполненииSelect name from test where dbo.AlphasOnly(name) = 'JoeBloggs' тогда это будет медленно, даже если функция займет 0 раз. Вы по-прежнему платите за чтение всех строк с диска (если вы говорите, что большая таблица означает, что ваша база данных не 'вписывается в память). Чтобы сделать это быстро, вам нужно найти способ индексации, поэтому я предлагаю вычисляемый столбец.
 CR41G1405 нояб. 2012 г., 22:36
очень медленное решение, требуется быстрое

1-й вариант -

Вы можете вложитьREPLACE() функционирует до 32 уровней. Работает быстро.

REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE (@str, '0', ''),
'1', ''),
'2', ''),
'3', ''),
'4', ''),
'5', ''),
'6', ''),
'7', ''),
'8', ''),
'9', '')

2-й вариант - сделать наоборот -

Удаление нечисловых данных из числа + SQL

3-й вариант - если вы хотите использовать регулярные выражения

затемhttp://www.sqlteam.com/forums/topic.asp?TOPIC_ID=27205

Этот работает для меня

CREATE Function [dbo].[RemoveNumericCharacters](@Temp VarChar(1000))
Returns VarChar(1000)
AS
Begin

    Declare @NumRange as varchar(50) = '%[0-9]%'
    While PatIndex(@NumRange, @Temp) > 0
        Set @Temp = Stuff(@Temp, PatIndex(@NumRange, @Temp), 1, '')

    Return @Temp
End

и вы можете использовать его так

SELECT dbo.[RemoveNumericCharacters](Name) FROM TARGET_TABLE

Еще один подход с использованием рекурсивного CTE.

declare @string varchar(100)
set @string ='te165st1230004616161616'

;With cte
as
(
select @string as string,0  as n
union all
select cast(replace(string,n,'') as varchar(100)),n+1
from cte
where n<9
)
select top 1 string from cte
order by n desc


**Output:**   
  test

использовать это в вашемwhere заявление:

    SELECT * FROM .... etc.
        Where 
         REPLACE
        (REPLACE
        (REPLACE
        (REPLACE
        (REPLACE
        (REPLACE
        (REPLACE
        (REPLACE
        (REPLACE
        (REPLACE (Name, '0', ''),
        '1', ''),
        '2', ''),
        '3', ''),
        '4', ''),
        '5', ''),
        '6', ''),
        '7', ''),
        '8', ''),
        '9', '') = P_SEARCH_KEY

Ваш ответ на вопрос