我有一个大型数据库,希望进行部分字符串搜索。用户将输入字符:JoeBloggs.
例如,如果我在数据库中有一个名字为Joe23BloGgs4
的记录。 我想删除名称中除A-Z以外的所有内容。
我使用REPLACE(Name,' ','')
函数来删除空格,并使用UPPER()
函数将名称大写化。
是否有更高效、更快捷的方法,例如基于正则表达式的方法,可以替换不是A-Z的任何内容,但不能改变数据库中的值。
我有一个大型数据库,希望进行部分字符串搜索。用户将输入字符:JoeBloggs.
例如,如果我在数据库中有一个名字为Joe23BloGgs4
的记录。 我想删除名称中除A-Z以外的所有内容。
我使用REPLACE(Name,' ','')
函数来删除空格,并使用UPPER()
函数将名称大写化。
是否有更高效、更快捷的方法,例如基于正则表达式的方法,可以替换不是A-Z的任何内容,但不能改变数据库中的值。
第一种选择 -
您可以嵌套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
ELSE '' END
替换为 ELSE val END
,这样即使其中没有数字也会返回。 - KoalaBear我刚开始重新学习 SQL...并且我在某个地方看到了这句话:
SELECT TRIM('0123456789' FROM customername )
你还可以使用这个方法来删除空格或其他符号。只需将它放在引号 ''
的第一个参数中即可。
SELECT TRIM('0123456789') FROM customername
。 - Leonard还有一种使用递归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
DecLARE @input varchar(50)= 'Joe 23 Blo Ggs 4'
SELECT TRANSLATE(@input,'0123456789',' ') As output1,
REPLACE
(
TRANSLATE(@input,'0123456789',' ') /*10 spaces here*/
, ' '
,''
) as output2
整个SELECT语句返回字符串:$P@M from Python
。可以使用这种方法去除多余的空格。
SELECT
REPLACE
(
TRANSLATE
(
'$P@M 1244 from93 Python', -- Replace each char from this string
'123456789', -- that is met in this set with
'000000000' -- the corresponding char from this set.
),
'0', -- Now replace all '0'
'' -- with nothing (void) (delete it).
) AS CLEARED;
引用 @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
REPLACE(TRANSLATE(YourField, '1234567890', '##########'),'#','')
移除第一个数字后的所有内容(适用于我的用例):
LEFT(field,PATINDEX('%[0-9]%',field+'0')-1)
移除尾随数字:
LEFT(field,len(field)+1-PATINDEX('%[^0-9]%',reverse('0'+field))