我有一个大型数据库,我想在其中进行部分字符串搜索。用户将输入字符:JoeBloggs.
为了论证,如果我在数据库中有一个名字Joe 23 Blo Ggs 4
。我想删除除A-Z以外的名字中的所有内容。
我有REPLACE(Name, ' ','')
函数删除空格和UPPER()
函数来大写名称。
是否有一种更有效的快速方式,可能通过正则表达式来替换除A-Z之外的任何东西。我无法更改数据库中的值。
提前致谢
答案 0 :(得分:32)
第一个选项 -
您可以将REPLACE()
个函数嵌套到最多32个级别。它运行得很快。
REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE (@str, '0', ''),
'1', ''),
'2', ''),
'3', ''),
'4', ''),
'5', ''),
'6', ''),
'7', ''),
'8', ''),
'9', '')
第二个选项 - 反过来 -
Removing nonnumerical data out of a number + SQL
第3个选项 - 如果你想使用正则表达式
答案 1 :(得分:11)
这个适用于我
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
答案 2 :(得分:4)
请在下面尝试查询。其中val是您的字符串或列名称。
CASE WHEN PATINDEX('%[a-z]%', REVERSE(val)) > 1
THEN LEFT(val, LEN(val) - PATINDEX('%[a-z]%', REVERSE(val)) + 1)
ELSE '' END
答案 3 :(得分:2)
使用递归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
答案 4 :(得分:0)
引用@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
答案 5 :(得分:0)
删除第一位数字后的所有内容(对于我的用例而言已足够): LEFT(field,PATINDEX('%[0-9]%',field +'0')-1)
删除尾随数字: LEFT(field,len(field)+ 1-PATINDEX('%[^ 0-9]%',reverse('0'+ field))
答案 6 :(得分:0)
DecLARE @input varchar(50)= 'Joe 23 Blo Ggs 4'
SELECT TRANSLATE(@input,'0123456789',' ') As output1,
REPLACE
(
TRANSLATE(@input,'0123456789',' ') /*10 spaces here*/
, ' '
,''
) as output2
答案 7 :(得分:0)
我刚刚开始重新学习 SQL...并且我在某处读到了这个:
SELECT TRIM('0123456789' FROM customername )
您也可以使用它来删除空格或其他符号。只需将其包含在引号 ''
内的第一个参数中。
答案 8 :(得分:-1)
未经测试,但你可以这样做:
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
关键是将其用作计算列并对其进行索引。如果数据库每次运行查询时都必须对大表中的每一行执行它,那么创建此函数的速度并不重要。