【问题标题】:SQL Server: Replace special character only when preceded by alphaSQL Server:仅在以字母开头时替换特殊字符
【发布时间】:2018-03-03 10:52:32
【问题描述】:

我正在尝试创建一个函数,该函数接受一个字符串并将[alpha character]" 的所有实例替换为[alpha character] Inch。例如,字符串4" sticker 变为4 Inch sticker,但字符串My "Loving" Brother 保持不变。

我知道我可以直接使用REPLACE(@String, '"', ' Inch') 替换,但这不会让第二个示例保持不变。仅当前面的值为 alpha (a-Z) 值时,如何替换此特殊字符?

感谢您的帮助!

【问题讨论】:

  • "All Instances" 所以如果你有4"x2" sticker book 什么都不会改变?所以真的,如果它只发生一次,你只想改变它?在我的书中,规则太开放了,无法模棱两可。也许... rextester.com/IFC94069 但它只处理 1 Case when len(src)-len(replace(src,'"','')) = 1 then replace(src,'"',' Inch ') else src end
  • 没错。考虑像您的示例这样的边缘情况肯定会很好,但是我认为如果我了解如何完成简单的情况,我可能会弄清楚如何构建其余的情况。我不想再浪费你(或其他任何人)不必要的时间。

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


【解决方案1】:

另一个选项,可以很容易地转换为表值函数或标量值函数

示例

Declare @S varchar(max) = 'The "bid" was for 8'' 12"'

Select @S = Replace(@S,MapFrom,MapTo)
 From (
        Select MapFrom = concat(n,MapFrom)
              ,MapTo   = concat(n,MapTo)
         From (values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) N(N)  
         Cross Join (values ('''',' Feet'),('"',' Inch')) C(MapFrom,MapTo)          
      ) A

Select @S

退货

The "bid" was for 8 Feet 12 Inch

只是为了辅助视觉

子查询生成以下内容,它只是执行一系列“动态”替换

【讨论】:

    【解决方案2】:

    您可以使用递归 CTE 来做到这一点,如下所示:

    declare @InputString varchar(100)
    set @InputString = '2"x4" picture frame "Love"'
    ;with a as(select convert(varchar(max),@InputString) i, convert(int, PATINDEX('%[0-9]"%', @InputString)) p
    union all 
    select stuff(i, p+1, 1, ' Inch') i, convert(int, PATINDEX('%[0-9]"%', stuff(i, p+1, 1, ' Inch'))) p
    from a where PATINDEX('%[0-9]"%', i) > 0)
    select * from a
    where p = 0
    

    结果:

    2 Inchx4 Inch picture frame "Love"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 2018-04-04
      • 1970-01-01
      • 1970-01-01
      • 2020-03-16
      相关资源
      最近更新 更多