我正在尝试创建一个接受字符串的函数,并用[alpha character]"
替换[alpha character] Inch
的所有实例。例如,字符串4" sticker
变为4 Inch sticker
,但字符串My "Loving" Brother
保持不变。
我知道我可以使用REPLACE(@String, '"', ' Inch')
直接替换,但这不会使第二个示例保持不变。如果前面的值是alpha(a-Z)值,我该如何替换这个特殊字符?
我感谢任何帮助!
答案 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
子查询生成以下内容,只执行一系列“动态”替换
答案 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