1

フィールドがスペースで区切られた値のリストであるIDandを含むテーブルがあります。ValueValue

ID           Value   
100           A1 A2 A3     
200           B1           
300           C1 C2

値の文字列を分割し、それぞれを ID を持つ個別の行として保持したい:

ID          Value
100           A1           
100           A2          
100           A3           
200           B1           
300           C1          
300           C2 

T-SQLでこれを行うにはどうすればよいですか?

4

3 に答える 3

4

カスタムSplit関数とCROSS APPLY次の機能を使用できます。

SELECT ID, Split.Item As Value
FROM dbo.TableName
CROSS APPLY dbo.Split(Value, ' ')as Split

DEMO

ただし、データベースを正規化し、別のテーブルを使用して ID を値にリンクすることをお勧めします。

このテーブル値関数を使用しました:

CREATE FUNCTION [dbo].[Split]
(
    @ItemList NVARCHAR(MAX), 
    @delimiter CHAR(1)
)
RETURNS @ItemTable TABLE (Item VARCHAR(250))  
AS      

BEGIN    
    DECLARE @tempItemList NVARCHAR(MAX)
    SET @tempItemList = @ItemList

    DECLARE @i INT    
    DECLARE @Item NVARCHAR(4000)

    --SET @tempItemList = REPLACE (@tempItemList, ' ', '')
    SET @i = CHARINDEX(@delimiter, @tempItemList)

    WHILE (LEN(@tempItemList) > 0)
    BEGIN
        IF @i = 0
            SET @Item = @tempItemList
        ELSE
            SET @Item = LEFT(@tempItemList, @i - 1)
        INSERT INTO @ItemTable(Item) VALUES(@Item)
        IF @i = 0
            SET @tempItemList = ''
        ELSE
            SET @tempItemList = RIGHT(@tempItemList, LEN(@tempItemList) - @i)
        SET @i = CHARINDEX(@delimiter, @tempItemList)
    END 
    RETURN
END  
于 2013-09-18T10:16:07.520 に答える