Split value from one field to two

前端 未结 14 2126
面向向阳花
面向向阳花 2020-11-22 03:49

I\'ve got a table field membername which contains both the last name and the first name of users. Is it possible to split those into 2 fields memberfirst<

相关标签:
14条回答
  • 2020-11-22 04:01

    Method I used to split first_name into first_name and last_name when the data arrived all in the first_name field. This will put only the last word in the last name field, so "john phillips sousa" will be "john phillips" first name and "sousa" last name. It also avoids overwriting any records that have been fixed already.

    set last_name=trim(SUBSTRING_INDEX(first_name, ' ', -1)), first_name=trim(SUBSTRING(first_name,1,length(first_name) - length(SUBSTRING_INDEX(first_name, ' ', -1)))) where list_id='$List_ID' and length(first_name)>0 and length(trim(last_name))=0
    
    0 讨论(0)
  • 2020-11-22 04:01

    In case someone needs to run over a table and split a field:

    1. First we use the function mention above:
    CREATE DEFINER=`root`@`localhost` FUNCTION `fn_split_str`($str VARCHAR(800), $delimiter VARCHAR(12), $position INT) RETURNS varchar(800) CHARSET utf8
        DETERMINISTIC
    BEGIN 
        RETURN REPLACE(
                SUBSTRING(
                    SUBSTRING_INDEX($str, $delimiter, $position),
                    LENGTH(
                        SUBSTRING_INDEX($str, $delimiter, $position -1)
                    ) + 1
                ),
        $delimiter, '');
    END
    
    1. Second, we run in a while loop on the string until there isn't any results (I've added $id for JOIN clause):
    CREATE DEFINER=`root`@`localhost` FUNCTION `fn_split_str_to_rows`($id INT, $str VARCHAR(800), $delimiter VARCHAR(12), $empty_table BIT) RETURNS int(11)
    BEGIN
    
        DECLARE position INT;
        DECLARE val VARCHAR(800);
        SET position = 1;
        
        IF $empty_table THEN
            DROP TEMPORARY TABLE IF EXISTS tmp_rows;    
        END IF;
                
        SET val = fn_split_str($str, ',', position);
                
        CREATE TEMPORARY TABLE IF NOT EXISTS tmp_rows AS (SELECT $id as id, val as val where 1 = 2);
            
        WHILE (val IS NOT NULL and val != '') DO               
            INSERT INTO tmp_rows
            SELECT $id, val;
            
            SET position = position + 1;
            SET val = fn_split_str($str, ',', position);
        END WHILE;
        
        RETURN position - 1;
    END
    
    1. Finally we can use it like that:
    DROP TEMPORARY TABLE IF EXISTS tmp_rows;
    SELECT  SUM(fn_split_str_to_rows(ID, FieldToSplit, ',', 0))
    FROM    MyTable;
    
    SELECT * FROM tmp_rows;
    

    You can use the id to join to other table.

    In case you are only splitting one value you can use it like that

    SELECT  fn_split_str_to_rows(null, 'AAA,BBB,CCC,DDD,EEE,FFF,GGG', ',', 1);
    SELECT * FROM tmp_rows;
    

    We don't need to empty the temporary table, the function will take care of that.

    0 讨论(0)
  • 2020-11-22 04:03

    Unfortunately MySQL does not feature a split string function. However you can create a user defined function for this, such as the one described in the following article:

    • MySQL Split String Function by Federico Cargnelutti

    With that function:

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

    you would be able to build your query as follows:

    SELECT SPLIT_STR(membername, ' ', 1) as memberfirst,
           SPLIT_STR(membername, ' ', 2) as memberlast
    FROM   users;
    

    If you prefer not to use a user defined function and you do not mind the query to be a bit more verbose, you can also do the following:

    SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(membername, ' ', 1), ' ', -1) as memberfirst,
           SUBSTRING_INDEX(SUBSTRING_INDEX(membername, ' ', 2), ' ', -1) as memberlast
    FROM   users;
    
    0 讨论(0)
  • 2020-11-22 04:07

    mysql 5.4 provides a native split function:

    SPLIT_STR(<column>, '<delimiter>', <index>)
    
    0 讨论(0)
  • 2020-11-22 04:09

    I had a column where the first and last name were both were in one column. The first and last name were separated by a comma. The code below worked. There is NO error checking/correction. Just a dumb split. Used phpMyAdmin to execute the SQL statement.

    UPDATE tblAuthorList SET AuthorFirst = SUBSTRING_INDEX(AuthorLast,',',-1) , AuthorLast = SUBSTRING_INDEX(AuthorLast,',',1);
    

    13.2.10 UPDATE Syntax

    0 讨论(0)
  • 2020-11-22 04:10
    UPDATE `salary_generation_tbl` SET
        `modified_by` = IF(
            LOCATE('$', `other_salary_string`) > 0,
            SUBSTRING(`other_salary_string`, 1, LOCATE('$', `other_salary_string`) - 1),
            `other_salary_string`
        ),
        `other_salary` = IF(
            LOCATE('$', `other_salary_string`) > 0,
            SUBSTRING(`other_salary_string`, LOCATE('$', `other_salary_string`) + 1),
            NULL
        );
    
    0 讨论(0)
提交回复
热议问题