从字符串中删除数字 SQL Server

37

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

例如,如果我在数据库中有一个名字为Joe23BloGgs4的记录。 我想删除名称中除A-Z以外的所有内容。

我使用REPLACE(Name,' ','')函数来删除空格,并使用UPPER()函数将名称大写化。

是否有更高效、更快捷的方法,例如基于正则表达式的方法,可以替换不是A-Z的任何内容,但不能改变数据库中的值。


你说你不能改变数据。那么你能否在现有表中添加一个计算列?或者添加一个带有外键和计算值的新表? - Laurence
@Laurence - 是的,我想我可以做到这一点,但我们能否在存储过程的临时表中完成呢?如果不行的话,我可以请求计算列,我只需要一个执行替换操作的函数即可。感谢您的迅速回复。 - CR41G14
如果性能很重要,我不建议使用正则表达式。你现在使用的方法很明显,但仍然是一个好方法! - vyakhir
@DmitryVyakhirev - 数据库可能存在一些类似 ' " @ / 的特殊字符,因为这是一个混乱的数据库,所以我需要进行多次替换来消除每个不良字符的实例。 - CR41G14
13个回答

50

第一种选择 -

您可以嵌套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


24

这个对我有效

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

7

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

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

1
我已经将 ELSE '' END 替换为 ELSE val END,这样即使其中没有数字也会返回。 - KoalaBear
非常适用于去除任何尾随的非字母数字字符。 - ashleedawg
如果字符串以数字开头或包含数字,则它将无法正常工作。 - Golden Lion

6

我刚开始重新学习 SQL...并且我在某个地方看到了这句话:

SELECT TRIM('0123456789' FROM customername )

你还可以使用这个方法来删除空格或其他符号。只需将它放在引号 '' 的第一个参数中即可。


差不多了!正确的写法是:SELECT TRIM('0123456789') FROM customername - Leonard
请注意,此操作仅移除开头和结尾的字符,而不会移除中间的字符:https://learn.microsoft.com/en-us/sql/t-sql/functions/trim-transact-sql?view=sql-server-ver16 - undefined

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

2
DecLARE @input varchar(50)= 'Joe 23 Blo Ggs 4'
    SELECT TRANSLATE(@input,'0123456789','          ') As output1,
            REPLACE
            (
                TRANSLATE(@input,'0123456789','          ') /*10 spaces here*/
                , ' '
                ,''
            ) as output2  

我们可以使用TRANSLATE函数。将要删除的字符列表作为连续数组声明,然后指定它们要被替换成什么。 - Vaibhav Kumar
这是一个不错的选择。它相当于在一个字符串上使用多个嵌套的REPLACE函数。你也可以使用TRIM函数来去除输出2前导和尾随的空格。 例如,TRIM(TRANSLATE(@input,'0123456789',' ')) 作为输出2。 - SujaiSparks

1

整个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;

1

引用 @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

1
我知道这是一个很旧的帖子,但我相信人们仍然会访问这个页面。现在你可以很容易地做到这一点:
 REPLACE(TRANSLATE(YourField, '1234567890', '##########'),'#','')

TRANSLATE将数字转换为“#”。REPLACE删除“#”。

0

移除第一个数字后的所有内容(适用于我的用例):

LEFT(field,PATINDEX('%[0-9]%',field+'0')-1)

移除尾随数字:

LEFT(field,len(field)+1-PATINDEX('%[^0-9]%',reverse('0'+field))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接