2017-04-13 1 views
-1

다음과 같이 PharmacyID와 Regimen을 가진 약국 테이블을 가지고 있습니다.결합 된 열 값을 다른 행으로 나누기

PharmacyID Regimen 
140646  3TC/D4T/EFV 
140653  ABC/D4T/NVP 

내 욕망은 이와 같은 것을 얻는 것입니다.

PharmacyID Regimen 
140646  3TC 
140646  D4T 
140646  EFV 
140653  ABC 
140653  D4T 
140653  NVP 

오전 내가 모든 솔루션

을 시도하지 않은 인터넷 검색에 갇혀
+0

MySQL, MS SQL Server 또는 Postgresql을 사용하고 있습니까? 대답은 실 거예요 ... – jarlh

+0

나는 MS SQL –

+0

을 사용하고 있습니다. (받아 들인 답안에서와 같이) 문자열 분할 함수를 사용하는 것은 나쁜 생각이 아닙니다. 그러나 더 나은 접근법이 있습니다. [여기 : Aaron Bertrand about String Splitters] https://sqlperformance.com/2012/07/t-sql-queries/split-strings) – Shnugo

답변

1

XML을 통해 문자열 분할 방법을 온 - 더 - 플라이이는 와 함께 작동합니다 :

DECLARE @tbl TABLE(PharmacyID INT,Regimen VARCHAR(100)); 
INSERT INTO @tbl VALUES(140646,'3TC/D4T/EFV') 
         ,(140653,'ABC/D4T/NVP'); 

WITH Casted AS (
       SELECT PharmacyID 
         ,CAST('<x>' + REPLACE((SELECT Regimen AS [*] FOR XML PATH('')),'/','</x><x>') + '</x>' AS XML) AS TheXML 
       FROM @tbl 
       ) 
SELECT PharmacyID 
     ,a.x.value(N'(./text())[1]','nvarchar(max)') AS Regimen 
FROM Casted 
CROSS APPLY Casted.TheXML.nodes(N'/x') AS A(x) 
0
create function [dbo].[udf_splitstring] (@tokens varchar(max), 
            @delimiter varchar(5)) 
returns @split table (
    token varchar(200) not null) 
as 



    begin 

     declare @list xml 

     select @list = cast('<a>' 
          + replace(@tokens, @delimiter, '</a><a>') 
          + '</a>' as xml) 

     insert into @split 
        (token) 
     select ltrim(t.value('.', 'varchar(200)')) as data 
     from @list.nodes('/a') as x(t) 

     return 

    end 



    CREATE TABLE #Table111 
     ([PharmacyID] int, [Regimen] varchar(11)) 
    ; 

    INSERT INTO #Table111 
     ([PharmacyID], [Regimen]) 
    VALUES 
     (140646, '3TC/D4T/EFV'), 
     (140653, 'ABC/D4T/NVP') 
    ; 
    select [PharmacyID], token FROM #Table111 as t1 
    CROSS APPLY [dbo].UDF_SPLITSTRING([Regimen],'/') as t2 

출력

PharmacyID token 
140646 3TC 
140646 D4T 
140646 EFV 
140653 ABC 
140653 D4T 
140653 NVP 
+0

은 MySQL, MS SQL Server 또는 PostgreSQL? – jarlh

+0

@ jarlh Mssql ... – Chanukya

+0

문자열 분리 함수가 최적의 위치에서 멀리 떨어져 있습니다 : 1) * 다중 문장 * TVF (** 매우 나쁜 성능 !! **) 그리고 2) 특수 문자로 저장하지 마십시오. '@ '토큰에'&'기호를 붙이면 ... – Shnugo

0
create table #temp1(string1 varchar(max)) 
Insert into #temp1 
Values('3TC/D4T/EFV'),('ABC/D4T/NVP') 

    SELECT 
    Replace(Replace(CAST(Tbl.Col.query('.') as varchar(max)),'<a>',''),'</a>','') 
    FROM 
(Select cast('<a>'+ replace(string1, '/', '</a><a>') + '</a>' as xml)as t 
    from #temp1) tl 
Cross apply 
    tl.t.nodes('/a') AS Tbl(Col) 
+0

이 답변은 금단의 문자로는 안전하지 않습니다. 입력 문자열에'& '를 넣으십시오 (''3TC/D & T/EFV'와 같은 것). 내 대답과 동일합니다. (글쎄, CTE 대신 sub select *) :-D – Shnugo

+0

그리고 (그냥 본 것) : 당신은'.query()'를 완전히 잘못 사용하고 있습니다! 결과를 캐스팅하고 문자열 수준에 태그! 내 대답은'.value()'로 변경하려고 ... – Shnugo