从字符串sql server中删除数字

时间:2012-11-05 21:00:38

标签: sql sql-server sql-server-2008

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

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

我有REPLACE(Name, ' ','')函数删除空格和UPPER()函数来大写名称。

是否有一种更有效的快速方式,可能通过正则表达式来替换除A-Z之外的任何东西。我无法更改数据库中的值。

提前致谢

9 个答案:

答案 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个选项 - 如果你想使用正则表达式

然后 http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=27205

答案 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

关键是将其用作计算列并对其进行索引。如果数据库每次运行查询时都必须对大表​​中的每一行执行它,那么创建此函数的速度并不重要。