Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:仅当前面有alpha时才替换特殊字符_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

SQL Server:仅当前面有alpha时才替换特殊字符

SQL Server:仅当前面有alpha时才替换特殊字符,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我正在尝试创建一个函数,该函数接受一个字符串,并将[alpha character]“的所有实例替换为[alpha character]Inch。例如,字符串4”贴纸变为4 Inch贴纸,但字符串我的“亲爱的”兄弟保持不变 我知道我可以使用replace(@String,“,”Inch')直接替换,但这不会使第二个示例保持不变。只有当前面的值是alpha(a-Z)值时,我如何替换这个特殊字符 非常感谢您的帮助!您可以使用递归CTE完成此操作,如下所示: declare @InputString

我正在尝试创建一个函数,该函数接受一个字符串,并将
[alpha character]“
的所有实例替换为
[alpha character]Inch
。例如,字符串
4”贴纸变为
4 Inch贴纸
,但字符串
我的“亲爱的”兄弟
保持不变

我知道我可以使用
replace(@String,“,”Inch')
直接替换,但这不会使第二个示例保持不变。只有当前面的值是alpha(a-Z)值时,我如何替换这个特殊字符


非常感谢您的帮助!

您可以使用递归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"

还有一个选项,可以轻松转换为表值函数或标量值函数

示例

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
只是为了辅助视觉效果

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


“所有实例”因此,如果您有
4“x2”贴纸簿
什么都不会改变?所以,您真的只想在值只出现一次时更改它吗?规则在我的书中太开放,不可能有歧义。也许……但它只处理1
情况,即len(src)-len(replace(src,“,”)=1,然后replace(src,“,”,“Inch”)else src end
这是正确的。像您的示例那样考虑边缘情况肯定会很好,但我认为如果我了解如何完成简单的情况,我可能会想出如何构建其余的。我不想再浪费您(或任何其他人)的时间了。