【问题标题】:Trim all Chars from String从字符串中修剪所有字符
【发布时间】:2022-11-01 19:18:02
【问题描述】:

我想截断列中的所有字符,无论它们在哪里。

例子: “+49123/4567890(测试号)”

应改为 “491234567890”

有没有办法不对每个字符进行替换?

我试过用几个来代替它,但它非常耗时。

【问题讨论】:

标签: sql-server


【解决方案1】:

正如您所提到的,如果您只期待[a-zA-z()/+],您可以使用translate 函数,该函数可从2017+ 获得

declare @table TABLE (str varchar(max))
insert into @table
select '+49123/4567890(estnumber)'

select replace(translate(str, '/+()abcdefghijklmnopqrstuvwxyz', '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'), '~', '') digits
from @table

对于未知字符的更复杂场景,您可以尝试在字符串列上使用递归 CTE 以仅提取数字,如以下查询。

;with cte
as (
    select v.txt originalstring
        ,v.txt
        ,convert(varchar(max), '') as digits
        ,1 as lev
    from (
        values ('+49123/4567890(testnumber)')
            ,('+234&*#$%!@#')
        ) v(txt)
    
    union all
    
    select originalstring
        ,stuff(txt, 1, 1, '')
        ,(
            case 
                when left(txt, 1) LIKE '[0-9]'
                    then digits + left(txt, 1)
                else digits
                end
            )
        ,lev + 1
    from cte
    where txt > ''
    )
select originalstring
    ,digits
from (
    select c.originalstring
        ,c.digits
        ,row_number() over (partition by c.originalstring order by lev desc
            ) rn
    from cte c
    ) t
where rn = 1

输出

originalstring                    digits
---------------                   --------
+234&*#$%!@#                      234
+49123/4567890(testnumber)        491234567890

【讨论】:

    【解决方案2】:

    SQL Server 2017+ 中存在的基于集合的选项是利用翻译.

    您可以希望将以下内容适应您的特定用例:

    select col, Replace(Translate(col, r, Replicate('*', Len(r))), '*', '') Newcol
    from t
    cross apply(values(' ABCDEFGHIJKLMNOPQRSTUVWXYZ/+()'))r(r);
    

    示例DB<>Fiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-26
      • 2012-03-21
      • 2014-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多