Подтвердить что ты не робот

Удалить номера из строкового sql-сервера

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

CASE WHEN PATINDEX('%[a-z]%', REVERSE(val)) > 1
                THEN LEFT(val, LEN(val) - PATINDEX('%[a-z]%', REVERSE(val)) + 1)
            ELSE '' END

Ответ 4

Еще один подход с использованием рекурсивного 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

Ответ 5

Цитируя часть ответа @Jatin с некоторыми изменениями,

используйте это в своем выражении 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

Ответ 6

Удалить все после первой цифры (было достаточно для моего варианта использования): ЛЕВЫЙ (поле, PATINDEX ( '% [0-9]%', field+ '0') -1)

Удалить завершающие цифры: ЛЕВЫЙ (поле, длина (поле) + 1-PATINDEX ( '% [^ 0-9]%', обратный ( '0' +field))

Ответ 7

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

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 <= Len(@s)
    Begin
      If SubString(@s, @Pos, 1) Like '[A-Za-z]'
      Begin
        Set @Ret = @Ret + SubString(@s, @Pos, 1)
      End
      Set @Pos = @Pos + 1
    End
  End
  Return @Ret
End

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