Удалить номера из строкового sql-сервера
У меня есть большая база данных, в которой я хочу выполнить поиск строки. Пользователь вводит символы: JoeBloggs.
Для аргументов, если у меня было имя Joe 23 Blo Ggs 4
в базе данных. Я хочу удалить все в имени, отличном от A-Z.
У меня есть функция REPLACE(Name, ' ','')
для удаления пробелов и функция UPPER()
для использования имени.
Есть ли более эффективный быстрый способ, может быть, с помощью регулярных выражений заменить что-либо, кроме A-Z. Я не могу изменить значения в базе данных.
Заранее спасибо
Ответы
Ответ 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
Ключ должен использовать это как вычисленный столбец и индексировать его. Неважно, насколько быстро вы выполняете эту функцию, если база данных должна выполнять ее против каждой строки в вашей большой таблице при каждом запуске запроса.