如何在MySQL中分割名称string?

如何在MySQL中分割名称string?

例如:

name ----- Sachin ramesh tendulkar Rahul dravid 

拆分名字像firstname,middlename,lastname

 firstname middlename lastname --------- ------------ ------------ sachin ramesh tendulkar rahul dravid 

我把这个答案分成两(2)个方法。 第一种方法将您的全名字段分为名字,中间名和姓氏。 如果没有中间名,则中间名将显示为NULL。

 SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(fullname, ' ', 1), ' ', -1) AS first_name, If( length(fullname) - length(replace(fullname, ' ', ''))>1, SUBSTRING_INDEX(SUBSTRING_INDEX(fullname, ' ', 2), ' ', -1) ,NULL) as middle_name, SUBSTRING_INDEX(SUBSTRING_INDEX(fullname, ' ', 3), ' ', -1) AS last_name FROM registeredusers 

第二种方法将中间名称视为姓氏的一部分。 我们将只从全名字段中select名字和姓氏列。

 SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(fullname, ' ', 1), ' ', -1) AS first_name, TRIM( SUBSTR(fullname, LOCATE(' ', fullname)) ) AS last_name FROM registeredusers 

有一些很酷的东西,你可以用substr,locate,substring_index等来检查手册是否有一些真正的困惑。 http://dev.mysql.com/doc/refman/5.0/en/string-functions.html

那么,我没有用过,所以我决定创build一个真正简单的拆分function,希望它可以帮助:

  DECLARE inipos INTEGER; DECLARE endpos INTEGER; DECLARE maxlen INTEGER; DECLARE item VARCHAR(100); DECLARE delim VARCHAR(1); SET delim = '|'; SET inipos = 1; SET fullstr = CONCAT(fullstr, delim); SET maxlen = LENGTH(fullstr); REPEAT SET endpos = LOCATE(delim, fullstr, inipos); SET item = SUBSTR(fullstr, inipos, endpos - inipos); IF item <> '' AND item IS NOT NULL THEN USE_THE_ITEM_STRING; END IF; SET inipos = endpos + 1; UNTIL inipos >= maxlen END REPEAT; 

这是我使用的拆分function:

 -- -- split function -- s : string to split -- del : delimiter -- i : index requested -- DROP FUNCTION IF EXISTS SPLIT_STRING; DELIMITER $ CREATE FUNCTION SPLIT_STRING ( s VARCHAR(1024) , del CHAR(1) , i INT) RETURNS VARCHAR(1024) DETERMINISTIC -- always returns same results for same input parameters BEGIN DECLARE n INT ; -- get max number of items SET n = LENGTH(s) - LENGTH(REPLACE(s, del, '')) + 1; IF i > n THEN RETURN NULL ; ELSE RETURN SUBSTRING_INDEX(SUBSTRING_INDEX(s, del, i) , del , -1 ) ; END IF; END $ DELIMITER ; SET @agg = "G1;G2;G3;G4;" ; SELECT SPLIT_STRING(@agg,';',1) ; SELECT SPLIT_STRING(@agg,';',2) ; SELECT SPLIT_STRING(@agg,';',3) ; SELECT SPLIT_STRING(@agg,';',4) ; SELECT SPLIT_STRING(@agg,';',5) ; SELECT SPLIT_STRING(@agg,';',6) ; 

你也可以使用bewlo:

 SELECT SUBSTRING_INDEX(Name, ' ', 1) AS fname, SUBSTRING_INDEX(SUBSTRING_INDEX(Name,' ', 2), ' ',-1) AS mname, SUBSTRING_INDEX(Name, ' ', -1) as lname FROM mytable; 

在空格分隔符的第二个实例之后获取string的其余部分

 SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('Sachin ramesh tendulkar', ' ', 1), ' ', -1) AS first_name, SUBSTRING_INDEX(SUBSTRING_INDEX('Sachin ramesh tendulkar', ' ', 2), ' ', -1) AS middle_name, SUBSTRING('Sachin ramesh tendulkar',LENGTH(SUBSTRING_INDEX('Sachin ramesh tendulkar', ' ', 2))+1) AS last_name 
 SELECT p.fullname AS 'Fullname', SUBSTRING_INDEX(p.fullname, ' ', 1) AS 'Firstname', SUBSTRING(p.fullname, LOCATE(' ',p.fullname), (LENGTH(p.fullname) - (LENGTH(SUBSTRING_INDEX(p.fullname, ' ', 1)) + LENGTH(SUBSTRING_INDEX(p.fullname, ' ', -1)))) ) AS 'Middlename', SUBSTRING_INDEX(p.fullname, ' ', -1) AS 'Lastname', (LENGTH(p.fullname) - LENGTH(REPLACE(p.fullname, ' ', '')) + 1) AS 'Name Qt' FROM people AS p LIMIT 100; 

解释:

find名字和姓氏很容易,你只需要使用SUBSTR_INDEX函数魔术发生在中间名,其中使用SUBSTR与定位find第一个空间位置和全名的长度 – (LENGTH firstname + LENGTH lastname)得到所有中间名。

请注意,名字和姓氏的长度是使用SUBSTR_INDEX计算的

MySQL中没有string拆分function。 所以你必须创build自己的function。 使用下面的链接。这将帮助你

http://blog.fedecarg.com/2009/02/22/mysql-split-string-function/

在空格分隔符的第二个实例之后获取string的其余部分:

 SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(MsgRest, ' ', 1), ' ', -1) AS EMailID , SUBSTRING_INDEX(SUBSTRING_INDEX(MsgRest, ' ', 2), ' ', -1) AS DOB , IF( LOCATE(' ', `MsgRest`) > 0, TRIM(SUBSTRING(SUBSTRING(`MsgRest`, LOCATE(' ', `MsgRest`) +1), LOCATE(' ', SUBSTRING(`MsgRest`, LOCATE(' ', `MsgRest`) +1)) +1)), NULL ) AS Person FROM inbox 

你可以使用common_schema并使用tokenize函数。 有关这方面的更多信息,请点击链接。 你的代码最终会像:

call tokenize(name, ' ');

但是,请注意,空格不是名字和姓氏的可靠分隔符。 例如在西class牙,通常有两个姓。

 DELIMITER $$ DROP FUNCTION IF EXISTS `split_name`$$ CREATE FUNCTION split_name (p_fullname TEXT, p_part INTEGER) RETURNS TEXT READS SQL DATA BEGIN DECLARE v_words INT UNSIGNED; DECLARE v_name TEXT; SET p_fullname=RTRIM(LTRIM(p_fullname)); SET v_words=(SELECT SUM(LENGTH(p_fullname) - LENGTH(REPLACE(p_fullname, ' ', ''))+1)); IF v_words=1 THEN IF p_part=1 THEN SET v_name=p_fullname; ELSEIF p_part=2 THEN SET v_name=NULL; ELSEIF p_part=3 THEN SET v_name=NULL; ELSE SET v_name=NULL; END IF; ELSEIF v_words=2 THEN IF p_part=1 THEN SET v_name=SUBSTRING(p_fullname, 1, LOCATE(' ', p_fullname) - 1); ELSEIF p_part=2 THEN SET v_name=SUBSTRING(p_fullname, LOCATE(' ', p_fullname) + 1); ELSEIF p_part=3 THEN SET v_name=NULL; ELSE SET v_name=NULL; END IF; ELSEIF v_words=3 THEN IF p_part=1 THEN SET v_name=SUBSTRING(p_fullname, 1, LOCATE(' ', p_fullname) - 1); ELSEIF p_part=2 THEN SET p_fullname=SUBSTRING(p_fullname, LOCATE(' ', p_fullname) + 1); SET v_name=SUBSTRING(p_fullname, 1, LOCATE(' ', p_fullname) - 1); ELSEIF p_part=3 THEN SET p_fullname=REVERSE (SUBSTRING(p_fullname, LOCATE(' ', p_fullname) + 1)); SET p_fullname=SUBSTRING(p_fullname, 1, LOCATE(' ', p_fullname) - 1); SET v_name=REVERSE(p_fullname); ELSE SET v_name=NULL; END IF; ELSEIF v_words>3 THEN IF p_part=1 THEN SET v_name=SUBSTRING(p_fullname, 1, LOCATE(' ', p_fullname) - 1); ELSEIF p_part=2 THEN SET p_fullname=REVERSE(SUBSTRING(p_fullname, LOCATE(' ', p_fullname) + 1)); SET p_fullname=SUBSTRING(p_fullname, LOCATE(' ', p_fullname,SUBSTRING_INDEX(p_fullname,' ',1)+1) + 1); SET v_name=REVERSE(p_fullname); ELSEIF p_part=3 THEN SET p_fullname=REVERSE (SUBSTRING(p_fullname, LOCATE(' ', p_fullname) + 1)); SET p_fullname=SUBSTRING(p_fullname, 1, LOCATE(' ', p_fullname) - 1); SET v_name=REVERSE(p_fullname); ELSE SET v_name=NULL; END IF; ELSE SET v_name=NULL; END IF; RETURN v_name; END; 

 SELECT split_name('Md. Obaidul Haque Sarker',1) AS first_name, split_name('Md. Obaidul Haque Sarker',2) AS middle_name, split_name('Md. Obaidul Haque Sarker',3) AS last_name 

首先创build过程如下:

 CREATE DEFINER=`root`@`%` PROCEDURE `sp_split`(str nvarchar(6500), dilimiter varchar(15), tmp_name varchar(50)) BEGIN declare end_index int; declare part nvarchar(6500); declare remain_len int; set end_index = INSTR(str, dilimiter); while(end_index != 0) do /* Split a part */ set part = SUBSTRING(str, 1, end_index - 1); /* insert record to temp table */ call `sp_split_insert`(tmp_name, part); set remain_len = length(str) - end_index; set str = substring(str, end_index + 1, remain_len); set end_index = INSTR(str, dilimiter); end while; if(length(str) > 0) then /* insert record to temp table */ call `sp_split_insert`(tmp_name, str); end if; END 

之后创build过程如下:

 CREATE DEFINER=`root`@`%` PROCEDURE `sp_split_insert`(tb_name varchar(255), tb_value nvarchar(6500)) BEGIN SET @sql = CONCAT('Insert Into ', tb_name,'(item) Values(?)'); PREPARE s1 from @sql; SET @paramA = tb_value; EXECUTE s1 USING @paramA; END 

如何调用testing

 CREATE DEFINER=`root`@`%` PROCEDURE `test_split`(test_text nvarchar(255)) BEGIN create temporary table if not exists tb_search ( item nvarchar(6500) ); call sp_split(test_split, ',', 'tb_search'); select * from tb_search where length(trim(item)) > 0; drop table tb_search; END call `test_split`('Apple,Banana,Mengo'); 
 CREATE DEFINER=`root`@`localhost` FUNCTION `getNameInitials`(`fullname` VARCHAR(500), `separator` VARCHAR(1)) RETURNS varchar(70) CHARSET latin1 DETERMINISTIC BEGIN DECLARE `result` VARCHAR(500) DEFAULT ''; DECLARE `position` TINYINT; SET `fullname` = TRIM(`fullname`); SET `position` = LOCATE(`separator`, `fullname`); IF NOT `position` THEN RETURN LEFT(`fullname`,1); END IF; SET `fullname` = CONCAT(`fullname`,`separator`); SET `result` = LEFT(`fullname`, 1); cycle: LOOP SET `fullname` = SUBSTR(`fullname`, `position` + 1); SET `position` = LOCATE(`separator`, `fullname`); IF NOT `position` OR NOT LENGTH(`fullname`) THEN LEAVE cycle; END IF; SET `result` = CONCAT(`result`,LEFT(`fullname`, 1)); -- SET `result` = CONCAT_WS(`separator`, `result`, `buffer`); END LOOP cycle; RETURN upper(`result`); END 

1.在mysql中执行这个函数。 2.这将创build一个function。 现在你可以在任何地方使用这个function。

  SELECT `getNameInitials`('Kaleem Ul Hassan', ' ') AS `NameInitials`; 

3.上面的getNameInitails第一个参数是你想要过滤的string,第二个是你想把string分开的旁观者字符。 4.在上面的例子中,“Kaleem Ul Hassan”是名字,我想要首字母,我的分隔符是空格。