SQL替换逗号分隔列表中不同字符之间的字符串

时间:2017-04-24 20:31:50

标签: sql replace charindex patindex

我希望删除字符串中两个不同特殊字符之间的文本。该字符串是逗号分隔的列表,其中包含一个值,该值后面紧跟着特殊字符,其中包含子字符串。字符和子字符串可以在逗号分隔列表中出现一次,多次或根本不出现。此外,两个字符之间的子字符串永远不会相同。我想删除大于/小于符号之间的任何内容,以及这两个字符。请注意我无权在此数据库中创建临时函数。

目前的结果:

PersonID     Loc     Code
12345    LOC1    M25.532<1010771>, S52.572A<1010772>, S66.892A<1010773>
12346    LOC2    M20.530<1010652>, S52.573A<1010752>
12347    LOC3    M29.52<1045201>

期望的结果:

PersonID     Location Code
12345    LOC1     M25.532, S52.572A, S66.892A
12346    LOC2     M20.530, S52.573A
12347    LOC3     M29.52

1 个答案:

答案 0 :(得分:1)

对于SQL Server:

在SQL Server 2016+中,您可以使用string_split()和SQL Server 2017+ string_agg()(但string_split()不会返回序数。)

在SQL Server 2016之前...使用Jeff Moden的CSV Splitter表值函数,我们可以在<上拆分,并使用stuff()删除里面>的部分使用select ... for xml path ('') method of string concatenation

将字符串连接在一起的子查询
select 
    t.PersonID
  , t.Loc
  , Code = (
      select stuff(s.Item,1,charindex('>',s.Item),'')
      from [dbo].[delimitedsplit8K](t.Code,'<') s
      where s.item<>''
      order by s.ItemNumber
      for xml path (''), type).value('.','varchar(8000)')
from t

rextester演示:http://rextester.com/JONQ18668

返回:

+----------+------+-----------------------------+
| PersonID | Loc  |            Code             |
+----------+------+-----------------------------+
|    12345 | LOC1 | M25.532, S52.572A, S66.892A |
|    12346 | LOC2 | M20.530, S52.573A           |
|    12347 | LOC3 | M29.52                      |
+----------+------+-----------------------------+

拆分字符串参考: