如何在mysql中拆分名称字符串?

Mad*_*hav 85 mysql sql

如何在mysql中拆分名称字符串?

例如:

name
-----
Sachin ramesh tendulkar
Rahul dravid
Run Code Online (Sandbox Code Playgroud)

将名称拆分为firstname,middlename,lastname:

firstname   middlename    lastname
---------  ------------   ------------
sachin     ramesh         tendulkar
rahul      dravid
Run Code Online (Sandbox Code Playgroud)

Jes*_*e C 154

我把这个答案分成了两(2)种方法.第一种方法将您的fullname字段分为名字,中间名和姓氏.如果没有中间名,则中间名将显示为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
Run Code Online (Sandbox Code Playgroud)

第二种方法将中间名视为姓氏的一部分.我们只会从您的fullname字段中选择firstname和lastname列.

SELECT
   SUBSTRING_INDEX(SUBSTRING_INDEX(fullname, ' ', 1), ' ', -1) AS first_name,
    TRIM( SUBSTR(fullname, LOCATE(' ', fullname)) ) AS last_name
FROM registeredusers
Run Code Online (Sandbox Code Playgroud)

你可以用substr,locate,substring_index等做一些很酷的事情.检查手册是否存在一些真正的混淆.http://dev.mysql.com/doc/refman/5.0/en/string-functions.html

  • 天哪,英特尔刚刚让我感觉超级人类拥有mysql pro技能.我已经完全删除了PHP处理,并在一个查询中转换了100行逻辑.这真太了不起了! (3认同)
  • 非常好。正是我所需要的,并且可能比他希望的更好地解决了提问者的问题事件,因为在两个单词的情况下,只设置了名字和姓氏,而不是名字和中间名。 (2认同)
  • 您好,先生,我知道这是一个旧线程。如果此人有分机名怎么办? (2认同)
  • @TrafalgarDLaw 我在上面发布了一个解决方案。- /sf/answers/3136157951/ (2认同)

Jon*_*han 21

好吧,我没用过任何东西,所以我决定创建一个真正简单的分割功能,希望它有所帮助:

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;
Run Code Online (Sandbox Code Playgroud)


Oli*_*ieu 16

这是我使用的分割功能:

--
-- 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) ;
Run Code Online (Sandbox Code Playgroud)


use*_*117 7

您也可以使用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;
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用。我觉得这种做法不好,但我运行了相同的查询来复制我的 case 语句,发现这种方法的速度是原来的两倍。谢谢。 (2认同)

Rah*_*pad 6

MySQL中没有字符串分割功能。因此您必须创建自己的函数。这将为您提供帮助。有关此链接的更多详细信息

功能:

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, '');
Run Code Online (Sandbox Code Playgroud)

用法:

SELECT SPLIT_STR(string, delimiter, position)
Run Code Online (Sandbox Code Playgroud)

例:

SELECT SPLIT_STR('a|bb|ccc|dd', '|', 3) as third;

+-------+
| third |
+-------+
| ccc   |
+-------+
Run Code Online (Sandbox Code Playgroud)

  • 这是迄今为止最简洁的解决方案;一件美丽的事!由于我的本地数据库设置,我必须在“RETURNS”之后添加“DETERMINISTIC”子句才能使其运行。 (2认同)