2017-04-13 36 views
-1

我有一個藥房表,藥房ID和方案如下;將組合列值分解爲不同的行

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關於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)不保存特殊字符(嘗試'@ tokens'用'&'符號... – 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):-D – Shnugo

+0

而且(剛纔看到這個):你正在使用'.query()'完全錯誤!你輸出結果並刪除在字符串級別標記!嘗試將其更改爲'.value()',就像在我的答案中一樣... – Shnugo