2017-09-07 68 views
0

我有一個select語句下面的格式 - 返回數據(從壞的數據庫設計)行添加到結果從逗號分隔的數據集

ID Numbers   
3 6,7,8  

,我需要調整它返回

ID Number    
3 6  
3 7 
3 8 

來修復它。什麼是最好的方法來做到這一點?我不需要一個永久的函數,我只需要一個select查詢的結果集導入到一個新的數據庫中。

謝謝!

+2

您是使用MySQL或MS SQL Server還是Sybase?答案將取決於所使用的dbms。 – jarlh

+1

順便說一句,最後編輯沒有太大的好處...... – jarlh

+2

不知道SQL Server 2015.如果2016年看一看string_split() –

回答

1

由於您使用的SQL Server 2015年,最好的選擇是寫一個UDF像這樣:

CREATE FUNCTION [dbo].[udfSplit] 
    (
     @sInputList VARCHAR(8000) -- List of delimited items 
     , 
     @sDelimiter VARCHAR(8000) = ',' -- delimiter that separates items 
    ) 
RETURNS @List TABLE (item VARCHAR(8000)) 
    BEGIN 
     DECLARE @sItem VARCHAR(8000); 
     WHILE CHARINDEX(@sDelimiter, @sInputList, 0) <> 0 
      BEGIN 
       SELECT @sItem = RTRIM(LTRIM(SUBSTRING(@sInputList, 1, 
                 CHARINDEX(@sDelimiter, 
                   @sInputList, 0) 
                 - 1))) , 
         @sInputList = RTRIM(LTRIM(SUBSTRING(@sInputList, 
                  CHARINDEX(@sDelimiter, 
                   @sInputList, 0) 
                  + LEN(@sDelimiter), 
                  LEN(@sInputList)))); 

       IF LEN(@sItem) > 0 
        INSERT INTO @List 
          SELECT @sItem; 
      END; 

     IF LEN(@sInputList) > 0 
      INSERT INTO @List 
        SELECT @sInputList; -- Put the last item in 
     RETURN; 
    END; 

並使用它像這樣:

SELECT ID , 
     item 
FROM (SELECT 3 AS ID , 
        '6,7,8' AS Numbers 
     ) x 
     CROSS APPLY udfSplit(x.Numbers, ','); 
+0

有一個類似的功能,但在Tally方法的性能增益方面是AMAZED。即使XML方法比LOOP更具性能 –

+0

如果有興趣,我將演示一種內聯XML方法和一個計數方法https://stackoverflow.com/questions/43082763/want-a-stored-procedure-for-comma -seperated-string-which-of-column-has-200/43082930#43082930 –

+0

@Icarus - 漂亮的功能謝謝你。我需要從現有表格中提取ID和數字。我沒有任何運氣在任何地方插入from子句。將「from」放在內部select子句中會導致每個ID有多行,但仍然以數字形式分隔字符串。 – jodeenm

0

試試這個:

DECLARE @YourTable Table (
    ID INT IDENTITY(1,1) 
    , Number VARCHAR(10) 
) 
INSERT INTO @YourTable 
VALUES 
    ('1,2,3') 
    , ('4,5,6,7') 
    , ('8,9') 
    , ('10') 

;WITH CTE 
AS 
(
    SELECT 1 AS ID 
    UNION ALL 
    SELECT ID + 1 FROM CTE 
    WHERE ID < 100 
) 
SELECT 
    x.ID 
    , SUBSTRING(x.Number, t.ID, CHARINDEX(',', x.Number + ',', t.ID) - t.ID) AS Number 
FROM @YourTable x 
JOIN CTE t 
    ON t.ID <= DATALENGTH(x.Number)+1 
    AND SUBSTRING(',' + x.Number, t.ID, 1) = ',' 
ORDER BY ID, Number 

更多信息可以在這裏找到:http://www.sqlservercentral.com/articles/Tally+Table/72993/