从sql server字符串中删除数字

从sql server字符串中删除数字,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个大型数据库,我想在其中进行部分字符串搜索。用户将输入字符:JoeBloggs 如果我在数据库中有一个名字叫Joe 23 Blo Ggs 4。我想删除名称中除A-Z以外的所有内容 我有REPLACEName“”函数来删除空格,还有上面的函数来大写名称 是否有一种更有效的快速方法,可以通过正则表达式替换除a-Z以外的任何内容。我无法更改数据库中的值。1st option- 您可以嵌套替换函数,最多32层。它跑得很快 REPLACE (REPLACE (REPLACE (REPLACE (RE

我有一个大型数据库,我想在其中进行部分字符串搜索。用户将输入字符:JoeBloggs

如果我在数据库中有一个名字叫Joe 23 Blo Ggs 4。我想删除名称中除A-Z以外的所有内容

我有REPLACEName“”函数来删除空格,还有上面的函数来大写名称

是否有一种更有效的快速方法,可以通过正则表达式替换除a-Z以外的任何内容。我无法更改数据库中的值。

1st option-

您可以嵌套替换函数,最多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.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
关键是将其用作计算列并为其编制索引。如果每次运行查询时,数据库都必须对大表中的每一行执行此函数,那么执行此函数的速度实际上并不重要。

这一点对我很有用

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

引用@Jatin answer的部分内容,并做一些修改

在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

使用递归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

请尝试下面的查询。其中val是字符串或列名

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

在第一个数字适合我的用例后删除所有内容: LEFTfield,PATINDEX“%[0-9]”,字段+'0'-1

删除尾随数字:
LEFTfield、lenfield+1-PATINDEX“[^0-9]%”,反向“0”+字段

您说您不能更改数据。能否向现有表中添加计算列?或者添加一个带有外键和计算值的新表?@Laurence-是的,我想我可以这样做,但我们可以在存储过程中的临时表中这样做吗?如果没有,那么我可以请求这个计算列,我所需要的只是执行替换的函数。感谢您的及时回复如果性能问题,我不建议使用regexp。你使用的方式是显而易见的,但仍然是一个很好的方式@DmitryVyakhirev-可能有一些胭脂字符,如“@/,这是一个混乱的数据库,因此我需要进行多次替换,以消除每个坏字符的实例非常慢的解决方案,fast是必需的如果您坚持从测试中选择名称,其中dbo.AlphasOnlyname='JoeBloggs',那么即使函数花费0时间,这也会很慢。您仍然需要支付从磁盘读取所有行的费用,假设您说的“大表”是指您的数据库无法装入内存。要使其快速,您需要找到一种索引方法,这就是我建议使用计算列的原因。我已将ELSE END替换为ELSE val END,因此当其中没有数字时,它也会返回。非常适合剥离任何尾随的非字母数字字符。如果字符串中有数字前导或在字符串中,则不起作用。我们可以使用TRANSLATE函数。以连续数组的形式列出要删除的字符列表,然后列出必须删除的字符
DecLARE @input varchar(50)= 'Joe 23 Blo Ggs 4'
    SELECT TRANSLATE(@input,'0123456789','          ') As output1,
            REPLACE
            (
                TRANSLATE(@input,'0123456789','          ') /*10 spaces here*/
                , ' '
                ,''
            ) as output2