28

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

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

我具有REPLACE(Name, ' ','')删除空格的UPPER()功能和将名称大写的功能。

是否有更有效的快速方法可能通过正则表达式来替换 AZ 以外的任何内容。我无法更改数据库中的值。

4

9 回答 9

44

第一个选项 -

您可以嵌套REPLACE()最多 32 层的函数。它跑得很快。

REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE
(REPLACE (@str, '0', ''),
'1', ''),
'2', ''),
'3', ''),
'4', ''),
'5', ''),
'6', ''),
'7', ''),
'8', ''),
'9', '')

第二个选项 - 做相反的 -

从数字中删除非数字数据+ SQL

第三个选项 - 如果你想使用正则表达式

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

于 2012-11-05T21:19:15.257 回答
20

这个对我有用

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
于 2013-02-25T16:40:56.237 回答
7

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

CASE WHEN PATINDEX('%[a-z]%', REVERSE(val)) > 1
                THEN LEFT(val, LEN(val) - PATINDEX('%[a-z]%', REVERSE(val)) + 1)
            ELSE '' END
于 2018-01-02T10:02:40.390 回答
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
于 2016-08-17T13:20:44.357 回答
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
于 2014-08-20T08:28:28.070 回答
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  
于 2021-06-11T17:11:18.420 回答
0

删除第一个数字之后的所有内容(对于我的用例来说已经足够了): LEFT(field,PATINDEX('%[0-9]%',field+'0')-1)

删除尾随数字: LEFT(field,len(field)+1-PATINDEX('%[^0-9]%',reverse('0'+field))

于 2019-10-12T00:09:38.683 回答
0

我刚开始重新学习 SQL ......我在某处读到了这个:

SELECT TRIM('0123456789' FROM customername )

您也可以使用它来删除空格或其他符号。只需将其包含在引号内的第一个参数中即可''

于 2021-07-23T23:36:57.070 回答
-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

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

于 2012-11-05T21:24:48.457 回答