Split delimited string value into rows

前端 未结 3 1947
栀梦
栀梦 2020-12-10 09:25

Some external data vendor wants to give me a data field - pipe delimited string value, which I find quite difficult to deal with.

Without help from an application pr

相关标签:
3条回答
  • 2020-12-10 09:28

    It may not be as difficult as I initially thought.

    This is a general approach:

    1. Count number of occurrences of the delimiter length(val) - length(replace(val, '|', ''))
    2. Loop a number of times, each time grab a new delimited value and insert the value to a second table.
    0 讨论(0)
  • 2020-12-10 09:38

    Although your issue is probably long time resolved, I was looking for a solution to the very same problem you had. I solved it with the help of a procedure referenced here with slight adaptions to serve multi-byte characters (such as the German Umlauts) in the string by using CHAR_LENGTH() instead of LENGTH().

    DELIMITER $$
        CREATE FUNCTION SPLIT_STRING(val TEXT, delim VARCHAR(12), pos INT) RETURNS TEXT
        BEGIN
            DECLARE output TEXT;
            SET output = REPLACE(SUBSTRING(SUBSTRING_INDEX(val, delim, pos), CHAR_LENGTH(SUBSTRING_INDEX(val, delim, pos - 1)) + 1), delim, '');
            IF output = '' THEN
                SET output = null;
            END IF;
            RETURN output;
        END $$
    
        CREATE PROCEDURE TRANSFER_CELL()
        BEGIN
            DECLARE i INTEGER;
            SET i = 1;
            REPEAT
                INSERT INTO NewTuple (id, value)
                SELECT id, SPLIT_STRING(value, '|', i)
                FROM Tuple
                WHERE SPLIT_STRING(value, '|', i) IS NOT NULL;
                SET i = i + 1;
            UNTIL ROW_COUNT() = 0
            END REPEAT;
        END $$
    DELIMITER ;
    
    CALL TRANSFER_CELL() ;
    
    DROP FUNCTION SPLIT_STRING ;
    DROP PROCEDURE TRANSFER_CELL ;
    
    0 讨论(0)
  • 2020-12-10 09:49

    Use this function by Federico Cargnelutti:

     CREATE FUNCTION SPLIT_STR(
     x VARCHAR(255),
     delim VARCHAR(12),
     pos INT
     )
       RETURNS VARCHAR(255)
       RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
    delim, '');
    

    Usage

     SELECT SPLIT_STR(string, delimiter, position)
    

    you will need a loop to solve your problem.

    0 讨论(0)
提交回复
热议问题