SQL Server:仅在以alpha开头时替换特殊字符

时间:2017-09-21 23:59:02

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

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

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

我感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

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

示例

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

只是为了帮助Visual

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

enter image description here

答案 1 :(得分:1)

您可以使用递归CTE执行此操作,如下所示:

func copyFileToZip(zf *zip.Writer, filename string) error {
    r, err := os.Open(filename)
    if err != nil {
        return err
    }
    defer r.Close()

    w, err := zf.Create(r.Name())
    if err != nil {
        return err
    }
    defer w.Close()

    _, err = io.Copy(w, r)
    if err != nil {
        return err
    }

    return w.Close()
}

结果:

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