创建一个将分隔的字符串拆分为表的函数

时间:2016-11-10 08:01:41

标签: mysql sql sql-server business-intelligence

为了拆分分隔的字符串,我需要创建一个函数,返回一个表并以逗号分隔的字符串作为参数。

例如,看一下这个输入表:

enter image description here

使用该功能,结果如下:

enter image description here

在这种情况下,分隔的字符串是Person列,应该作为参数。

提前致谢。

3 个答案:

答案 0 :(得分:1)

试试这个

    --Build Schema for Your Case

    DECLARE @TAB TABLE (ID INT, NAME VARCHAR(1000))
    INSERT INTO @TAB
    SELECT 1,'Pravesh,Simon'
    UNION ALL
    SELECT 2,'Me,Myself,I'


    --Used Recursive CTE to achieve Tabular view of Comma Separated Column
    --Used While loop to take next row
    --Used Table Variable @RESULT to store your Result Set

    DECLARE @ID INT,  @T VARCHAR(100), @SNO INT= 1, @MAX_SNO INT
    DECLARE @RESULT TABLE (ID INT, NAME VARCHAR(1000))


    SELECT @SNO=1, @MAX_SNO =MAX(ID) FROM @TAB

    WHILE(@SNO<=@MAX_SNO)
    BEGIN
    SELECT @ID = ID, @T = NAME FROM @TAB WHERE ID=@SNO
    SET @T =@T+','


    ;WITH MyCTE(Start,[End]) AS(

    SELECT 1 AS Start,CHARINDEX(',',@T,1) AS [End]
    UNION ALL
    SELECT [End]+1 AS Start,CHARINDEX(',',@T,[End]+1)AS [End] 
    from MyCTE where [End]<LEN(@T)
    )

    INSERT INTO @RESULT

    Select @SNO AS ID, SUBSTRING(@T,Start,[End]-Start) NAME from MyCTE;


    SET @SNO+=1
    END

    --Getting Result Set

    SELECT * FROM @RESULT

编辑:来自您的评论

如果你想用一个函数做上面的事情,这个比上面的循环容易。

    CREATE FUNCTION [DBO].[FN_SPLIT_STR_TO_COL] (@T AS VARCHAR(4000) )
    RETURNS
     @RESULT TABLE(VALUE VARCHAR(250))
    AS
    BEGIN
         SET @T= @T+','
           ;WITH MYCTE(START,[END]) AS(

        SELECT 1 AS START,CHARINDEX(',',@T,1) AS [END]
        UNION ALL
        SELECT [END]+1 AS START,CHARINDEX(',',@T,[END]+1)AS [END] 
        FROM MYCTE WHERE [END]<LEN(@T)
        )
        INSERT INTO @RESULT 
        SELECT SUBSTRING(@T,START,[END]-START) NAME FROM MYCTE;

          RETURN 
    END

现在只需通过将列传递给它来调用每一行的函数。

使用Cross Apply

SELECT ID,FN_RS.VALUE FROM @TAB
CROSS APPLY
(SELECT * FROM [DBO].[FN_SPLIT_STR_TO_COL] (NAME)) AS FN_RS

答案 1 :(得分:0)

尝试这个查询

//Which will work only when having 3 comma only


        SELECT Id,SUBSTRING_INDEX(SUBSTRING_INDEX(`Person`, ',', 1), ',', -1)  as Person
          FROM `table`
         UNION
         select Id,SUBSTRING_INDEX(SUBSTRING_INDEX(`Person`, ',', 2), ',', -1)  as Person
          FROM `table`
        UNION
         select Id,SUBSTRING_INDEX(SUBSTRING_INDEX(`Person`, ',', 3), ',', -1)  as Person
          FROM `table`
    order by Id ASC

答案 2 :(得分:0)

($ 3) :: Num a => (a -> b) -> b
相关问题