sql >> データベース >  >> RDS >> Sqlserver

カンマ区切りの文字列を個々の行に変換する

    SQLServerのすばらしい再帰関数を使用できます。

    サンプルテーブル:

    CREATE TABLE Testdata
    (
        SomeID INT,
        OtherID INT,
        String VARCHAR(MAX)
    );
    
    INSERT Testdata SELECT 1,  9, '18,20,22';
    INSERT Testdata SELECT 2,  8, '17,19';
    INSERT Testdata SELECT 3,  7, '13,19,20';
    INSERT Testdata SELECT 4,  6, '';
    INSERT Testdata SELECT 9, 11, '1,2,3,4';
    

    クエリ

    WITH tmp(SomeID, OtherID, DataItem, String) AS
    (
        SELECT
            SomeID,
            OtherID,
            LEFT(String, CHARINDEX(',', String + ',') - 1),
            STUFF(String, 1, CHARINDEX(',', String + ','), '')
        FROM Testdata
        UNION all
    
        SELECT
            SomeID,
            OtherID,
            LEFT(String, CHARINDEX(',', String + ',') - 1),
            STUFF(String, 1, CHARINDEX(',', String + ','), '')
        FROM tmp
        WHERE
            String > ''
    )
    SELECT
        SomeID,
        OtherID,
        DataItem
    FROM tmp
    ORDER BY SomeID;
    -- OPTION (maxrecursion 0)
    -- normally recursion is limited to 100. If you know you have very long
    -- strings, uncomment the option
    

    出力

     SomeID | OtherID | DataItem 
    --------+---------+----------
     1      | 9       | 18       
     1      | 9       | 20       
     1      | 9       | 22       
     2      | 8       | 17       
     2      | 8       | 19       
     3      | 7       | 13       
     3      | 7       | 19       
     3      | 7       | 20       
     4      | 6       |          
     9      | 11      | 1        
     9      | 11      | 2        
     9      | 11      | 3        
     9      | 11      | 4        
    


    1. 新機能の紹介:Always On Availability Group

    2. C#コードからMSSQL ServerへのSQLインジェクションを回避するアルゴリズム?

    3. SQLServerでIF...THENロジックを使用する方法

    4. generate_seriesを使用してPostgreSQLで欠落している日付を埋める方法