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