2017-04-24 1 views
-1

문자열에서 두 개의 다른 특수 문자 사이의 텍스트를 제거하려고합니다. 문자열은 사이에 부분 문자열이있는 특수 문자가 바로 뒤에 오는 값을 포함하는 쉼표로 구분 된 목록입니다. 문자 및 하위 문자열은 쉼표로 구분 된 목록에서 한 번, 여러 번 또는 전혀 표시되지 않을 수 있습니다. 또한 두 문자 사이의 하위 문자열은 결코 동일하지 않습니다. 나는 더 중대한 것 /보다 적게 상징,뿐만 아니라 그 2 개의 특성 사이에서 무엇이든을 제거하고 싶으면. 이 데이터베이스에는 임시 함수를 만들 수있는 권한이 없습니다.SQL 쉼표로 구분 된 목록의 다른 문자 사이의 문자열 바꾸기

현재 결과 :

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> 

원하는 결과 : SQL Server의

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

태그 질문을. –

+0

정규식 작업과 같은 소리입니다. regex 지원은 제품마다 다르기 때문에 사용중인 데이터베이스를 지정하십시오. – lit

답변

0

:

당신이 string_split()를 사용할 수 2016+ SQL 서버에서

및 SQL Server의 2017+ string_agg() (하지만 string_split()은 서수를 반환하지 않습니다).

이전 제프 MODEN하여 CSV 분배기 테이블 반환 함수 우리가 <에 분할하고, 사용하여 함께 다시 문자열을 연결하는 하위 쿼리 내부 >에 부분을 제거 stuff()을 사용할 수 있습니다 사용하여 SQL Server 2016 ...에 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      | 
+----------+------+-----------------------------+ 
,

분할 문자열 참조 : 사용중인 데이터베이스

관련 문제