解析两个逗号分隔的字段

时间:2014-05-15 15:48:56

标签: sql-server

使用MS SQL Studio,我需要解析两个以逗号分隔的字段,这些字段彼此对齐。例如:

Name           Pet_Name            Type
Bob            Sally,Betty,Sue     Cat,Dog,Cat
Dick           Mary,Fido,Polly     Dog,Dog,Bird

Parsed to:
Name           Pet_Name            Type
Bob            Sally               Cat
Bob            Betty               Dog
Bob            Sue                 Cat
Dick           Mary                Dog
Dick           Fido                Dog
Dick           Polly               Bird 

所有宠物名称都与其各自的类型相匹配。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

创建一个输入表。

CREATE TABLE dbo.Input
(
    Name NVARCHAR(25) NOT NULL PRIMARY KEY,
    Pet_Names NVARCHAR(200) NOT NULL,
    Types NVARCHAR(200) NOT NULL
);

INSERT INTO dbo.Input (Name, Pet_Names, Types)
VALUES
    (N'Bob', N'Sally,Betty,Sue', N'Cat,Dog,Cat'), 
    (N'Dick', N'Mary,Fido,Polly', N'Dog,Dog,Bird');

创建一个用户定义的表函数,用于拆分Pet_Names和Types。

CREATE FUNCTION dbo.ufn_Split
(
    @name NVARCHAR(25),
    @pet_names NVARCHAR(200),
    @types NVARCHAR(200)
)
RETURNS @ret TABLE
(
    Name NVARCHAR(25),
    Pet_Name NVARCHAR(25),
    Type NVARCHAR(25)
)
AS
BEGIN
    DECLARE @pet_names2 NVARCHAR(200);
    DECLARE @types2 NVARCHAR(200);
    DECLARE @i INT;
    DECLARE @j INT;
    DECLARE @p NVARCHAR(25);
    DECLARE @t NVARCHAR(25);

    SET @pet_names2 = @pet_names;
    SET @types2 = @types;

    WHILE LEN(@pet_names2) > 0 AND LEN(@types2) > 0
    BEGIN
        SET @i = CHARINDEX(N',', @pet_names2);
        SET @j = CHARINDEX(N',', @types2);

        IF @i > 0 AND @j > 0
        BEGIN
            SET @p = SUBSTRING(@pet_names2, 1, @i-1);
            SET @pet_names2 = SUBSTRING(@pet_names2, @i+1, LEN(@pet_names2)-@i);

            SET @t = SUBSTRING(@types2, 1, @j-1);
            SET @types2 = SUBSTRING(@types2, @j+1, LEN(@types2)-@j);
        END
        ELSE
        BEGIN
            SET @p = @pet_names2;
            SET @pet_names2 = NULL;

            SET @t = @types2;
            SET @types2 = NULL;
        END

            INSERT INTO @ret (Name, Pet_Name, Type)
                VALUES(@Name, @p, @t);
    END

    RETURN
END;

运行一个select语句。

SELECT T.*
    FROM dbo.Input AS I
        CROSS APPLY dbo.ufn_Split(I.Name, I.Pet_Names, I.Types) AS T;

结果

Name        Pet_Name    Type
Bob         Sally       Cat
Bob         Betty       Dog
Bob         Sue         Cat
Dick        Mary        Dog
Dick        Fido        Dog
Dick        Polly       Bird

用T-SQL编写并在SQL Server 2012上测试的代码。

警告这是演示代码,对于生产系统而言不够强大。您必须考虑错误情况,例如Pet_Names和Types中的不同项目数。