Sql 当字符串长度为动态时,替换字符串文本的特定部分

Sql 当字符串长度为动态时,替换字符串文本的特定部分,sql,Sql,我正在尝试使用sql进行字符串操作,该sql会更改“str[”之后的文本(已经使用dbo.function从表中提取了字符串) 原始字符串如下所示: 2.2.2.3[1.2.3]-4.3.2.1-t+3-kb-str[8.6.5.4.3] 结果是: 2.2.2.3[1.2.3]-4.3.2.1-t+3-kb-str[10.8.6.5.4] 字符串长度通常可以大于或小于'str'之前的字符长度['由于字符串中有括号,我不能将其用作保留。只是想知道是否有人有一些建议。以下脚本是根据SQL Serve

我正在尝试使用sql进行字符串操作,该sql会更改“str[”之后的文本(已经使用dbo.function从表中提取了字符串)

原始字符串如下所示:

2.2.2.3[1.2.3]-4.3.2.1-t+3-kb-str[8.6.5.4.3]

结果是:

2.2.2.3[1.2.3]-4.3.2.1-t+3-kb-str[10.8.6.5.4]


字符串长度通常可以大于或小于'str'之前的字符长度['由于字符串中有括号,我不能将其用作保留。只是想知道是否有人有一些建议。

以下脚本是根据SQL Server编写的,但您可以将相同的逻辑应用于其他语法已更改的数据库-

注意:这只适用于目标字符串是源字符串的最后一部分,并且新字符串是固定的“str[10.8.6.5.4]”

DECLARE @S VARCHAR(MAX) = '2.2.2.3[1.2.3] - 4.3.2.1 - t+ 3 - kb - str[8.6.5.4.3]'

SELECT LEFT (@S, CHARINDEX('str[', @S,0) - 1) + 'str[10.8.6.5.4]'

假设您使用的是SQL Server,以下查询包含
reverse()
charindex()
replace()
substring()
parsename()
可能会一起使用:

with t(str0) as
(
 select '2.2.2.3[1.2.3] - 4.3.2.1 - t+ 3 - kb - str[8.6.5.4.3]'
), t2 as
(
 select reverse(substring(reverse(str0),2,charindex('[',reverse(str0))-2)) as str,
        str0
   from t
)
select replace( str0, str,
       concat(
       '10.',  
       substring(str,1,charindex('.',str)-1),'.',
       parsename(substring(str,charindex('.',str)+1,len(str)),4),'.',
       parsename(substring(str,charindex('.',str)+1,len(str)),3),'.',
       parsename(substring(str,charindex('.',str)+1,len(str)),2)) ) as Result
  from t2;
其中,假定点数固定,以便能够使用
parsename()


请标记适当的数据库名称。请确认预期的替换参数是否始终是字符串的最后一部分?它将始终是字符串的最后一部分。我认为,就数据库It SQL Server而言,MSSQL也适用于此