将一个字段中的值拆分为两个字段

136

我有一个表格字段membername,其中包含用户的名字和姓氏。是否可以将它们拆分成两个字段memberfirstmemberlast

所有记录都具有此格式“名字 姓氏”(不带引号且中间有一个空格)。


7
所有记录的格式都是“名 姓”(不带引号且中间有一个空格)。令人惊奇的是,请,在做数据库决策时不要忘记像我这样的人。太多时候,我会看到网站告诉我我的姓氏包含一个“非法”的字符……:( - Stijn de Witt
另请参见SQL将值拆分为多行 - tripleee
14个回答

0

当数据全部放在名字字段中时,我使用的方法是将first_name拆分为first_name和last_name。这将只在last name字段中放置最后一个单词,因此"john phillips sousa"将成为"john phillips"的名字和"sousa"的姓氏。它还避免覆盖已经修复过的任何记录。

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

如果有人需要遍历表并拆分字段:

  1. 首先我们使用上述提到的函数
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

其次,我们在字符串上运行 while 循环,直到没有任何结果(我已经添加了 $id 用于 JOIN 子句):
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

最后,我们可以这样使用它:
DROP TEMPORARY TABLE IF EXISTS tmp_rows;
SELECT  SUM(fn_split_str_to_rows(ID, FieldToSplit, ',', 0))
FROM    MyTable;

SELECT * FROM tmp_rows;

您可以使用ID与其他表进行连接。

如果您只拆分一个值,可以像这样使用它

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

我们不需要清空临时表,函数会自动处理。

0
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
    );

-3

MySQL 5.4 提供了本地的分割函数:

SPLIT_STR(<column>, '<delimiter>', <index>)

3
能否提供文档链接?在dev.mysql.com上搜索无果。第12.5节的评论中有社区建议这个函数的用法。 - DRaehal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接