2017-04-24 152 views
-1

我期待在一个字符串中删除两个不同的特殊字符之间的文本。该字符串是包含后面紧跟特殊字符之间的子字符串的值以逗号分隔的列表。字符和子字符串可以在逗号分隔列表中出现一次,多次或完全不显示。而且,这两个字符之间的子串永远不会相同。我想删除大于/小于符号以及这两个字符之间的任何内容。请注意我没有权限在这个数据库中创建临时函数。SQL以逗号分隔的列表不同charaters之间的替换字符串

当前的结果:

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

这听起来像一个正则表达式的工作。请指定您使用的数据库,因为正则表达式支持因产品而异。 – lit

回答

0

对于SQL Server:

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

之前到SQL Server 2016 ...使用由杰夫MODEN一个CSV分路器表值函数,我们可以分割上<,并使用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      | 
+----------+------+-----------------------------+ 

分割字符串参考: