복붙노트

[SQL] 어떻게 MySQL의에서 이름 문자열을 분할하는?

SQL

어떻게 MySQL의에서 이름 문자열을 분할하는?

어떻게 MySQL의에서 이름 문자열을 분할하는?

예 :. :

name
-----
Sachin ramesh tendulkar
Rahul dravid

FIRSTNAME, 가운데 이름, LASTNAME 같은 이름을 분할 :

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

해결법

  1. ==============================

    1.나는 2 개의 방법으로이 답변을 분리했습니다. 첫 번째 방법은, 먼저 중간, 마지막 이름으로 전체 이름 필드를 분리합니다. 어떤 중간 이름이없는 경우 중간 이름은 NULL로 표시됩니다.

    나는 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
    

    이 두 번째 방법은 LASTNAME의 일부로서 중간 이름을 고려합니다. 우리는 귀하의 전체 이름 필드에서 이름 및 성 열을 선택합니다.

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

    당신이 등 SUBSTR, 위치, SUBSTRING_INDEX, 진짜 혼란에 대한 설명서를 확인하여 수행 할 수있는 멋진 물건의 무리가 있습니다. http://dev.mysql.com/doc/refman/5.0/en/string-functions.html

  2. ==============================

    2.음, 아무것도 내가 일하지 사용, 내가 진짜 간단한 분할 기능을 만들기로 결정, 그래서 그것이 도움이되기를 바랍니다 :

    음, 아무것도 내가 일하지 사용, 내가 진짜 간단한 분할 기능을 만들기로 결정, 그래서 그것이 도움이되기를 바랍니다 :

    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;
    
  3. ==============================

    3.다음은 분할 기능 I 사용은 다음과 같습니다

    다음은 분할 기능 I 사용은 다음과 같습니다

    --
    -- 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) ;
    
  4. ==============================

    4.또한 하나 bewlo 사용할 수 있습니다 :

    또한 하나 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;
    
  5. ==============================

    5.MySQL은 어떤 문자열 분할 기능이 없습니다. 그래서 당신은 당신의 자신의 함수를 작성해야합니다. 이것은 당신이 도움이 될 것입니다. 이 링크에서 자세한 내용.

    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, '');
    
    SELECT SPLIT_STR(string, delimiter, position)
    
    SELECT SPLIT_STR('a|bb|ccc|dd', '|', 3) as third;
    
    +-------+
    | third |
    +-------+
    | ccc   |
    +-------+
    
  6. ==============================

    6.

    select (case when locate('(', LocationName) = 0 
            then 
                horse_name
            else 
               left(LocationName, locate('(', LocationName) - 1)
           end) as Country            
    from   tblcountry;
    
  7. ==============================

    7.공간 구분의 두 번째 인스턴스 후 문자열의 나머지를 얻으려면

    공간 구분의 두 번째 인스턴스 후 문자열의 나머지를 얻으려면

    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
    
  8. ==============================

    8.

    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
    

    MySQL은이 기능을 1.Execute. 2.이 함수를 작성합니다. 지금 당신은 당신이 원하는이 기능 어디서나 사용할 수 있습니다.

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

    3. 위의 getNameInitails 첫 번째 매개 변수는 필터링 할과 두 번째 당신에게 문자열을 분리하려는 관객의 문자가 문자열입니다. 위의 예 'Kaleem UL 하산'4. 이름이고 난 이니셜을 얻고 싶은 내 분리 공간 ''입니다.

  9. ==============================

    9.

    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; 
    

    설명 :

    FIRSTNAME을 찾아 LASTNAME 쉽게, 당신은 단지 SUBSTR_INDEX 기능을 사용할 필요가있다 (길이 FIRSTNAME + 길이의 LASTNAME) 모든 가운데 이름을 얻을 - 매직은 전체 이름의 첫 번째 공간의 위치와 길이를 찾기 위해 찾아 함께 SUBSTR을 사용 가운데 이름에 발생합니다.

    이름 및 성의 길이를 참고 SUBSTR_INDEX을 사용하여 계산 하였다

  10. ==============================

    10.우리는 하나의 열 ChapterName에서 물론 이름의 값과 장 이름을 저장 한.

    우리는 하나의 열 ChapterName에서 물론 이름의 값과 장 이름을 저장 한.

    값은 같은 저장 : "자바 : 다형성을"

    JAVA 및 ChapterName : 당신은 CourseName를 검색 할 필요가 다형성을

    다음은 검색하는 SQL 선택 쿼리입니다.

           SELECT   
              SUBSTRING_INDEX(SUBSTRING_INDEX(ChapterName, ' ', 1), ' ', -1) AS 
           CourseName,
    
           REPLACE(TRIM(SUBSTR(ChapterName, LOCATE(':', ChapterName)) ),':','') AS 
           ChapterName
           FROM Courses where `id`=1;
    

    내가 여기에 대한 질문이 있으면 알려 주시기 바랍니다.

  11. ==============================

    11.공간 구분의 두 번째 인스턴스 후 문자열의 나머지를 얻으려면 :

    공간 구분의 두 번째 인스턴스 후 문자열의 나머지를 얻으려면 :

    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
    
  12. ==============================

    12.당신은 common_schema를 사용하고 토큰 화 기능을 사용할 수 있습니다. 이 문제에 대한 자세한 내용은 링크를 따르십시오. 당신의 코드처럼 끝날 것입니다 :

    당신은 common_schema를 사용하고 토큰 화 기능을 사용할 수 있습니다. 이 문제에 대한 자세한 내용은 링크를 따르십시오. 당신의 코드처럼 끝날 것입니다 :

    토큰 화 (이름, '')를 호출;

    그러나, 공간 이름과 성을위한 신뢰할 수있는 분리 아님을주의해야합니다. 예를 들면 스페인은 마지막 두 이름을 가지고하는 것이 일반적입니다.

  13. ==============================

    13.

    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
    
  14. ==============================

    14.먼저 다음과 같이 절차를 만듭니다 :

    먼저 다음과 같이 절차를 만듭니다 :

    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
    

    그 후 다음과 같이 프로 시저를 만들 :

    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
    

    어떻게 전화 테스트

    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');
    
  15. ==============================

    15.문자열의 일부를 반환하는 SP를 만들려면 여기 몇 가지 답변을 결합.

    문자열의 일부를 반환하는 SP를 만들려면 여기 몇 가지 답변을 결합.

    drop procedure if exists SplitStr;
    DELIMITER ;;
    CREATE PROCEDURE `SplitStr`(IN Str VARCHAR(2000), IN Delim VARCHAR(1))  
        BEGIN
            DECLARE inipos INT;
            DECLARE endpos INT;
            DECLARE maxlen INT;
            DECLARE fullstr VARCHAR(2000);
            DECLARE item VARCHAR(2000);
            create temporary table if not exists tb_split
            (
                item varchar(2000)
            );
    
    
    
            SET inipos = 1;
            SET fullstr = CONCAT(Str, 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           
                    insert into tb_split values(item);
                END IF;
                SET inipos = endpos + 1;
            UNTIL inipos >= maxlen END REPEAT;
    
            SELECT * from tb_split;
            drop table tb_split;
        END;;
    DELIMITER ;
    
  16. ==============================

    16.

    concat(upper(substring(substring_index(NAME, ' ', 1) FROM 1 FOR 1)), lower(substring(substring_index(NAME, ' ', 1) FROM 2 FOR length(substring_index(NAME, ' ', 1))))) AS fname,
    CASE 
    WHEN length(substring_index(substring_index(NAME, ' ', 2), ' ', -1)) > 2 THEN 
      concat(upper(substring(substring_index(substring_index(NAME, ' ', 2), ' ', -1) FROM 1 FOR 1)), lower(substring(substring_index(substring_index(f.nome, ' ', 2), ' ', -1) FROM 2 FOR length(substring_index(substring_index(f.nome, ' ', 2), ' ', -1)))))
      ELSE 
      CASE 
      WHEN length(substring_index(substring_index(f.nome, ' ', 3), ' ', -1)) > 2 THEN 
        concat(upper(substring(substring_index(substring_index(f.nome, ' ', 3), ' ', -1) FROM 1 FOR 1)), lower(substring(substring_index(substring_index(f.nome, ' ', 3), ' ', -1) FROM 2 FOR length(substring_index(substring_index(f.nome, ' ', 3), ' ', -1)))))
      END 
    END 
    AS mname
    
  17. from https://stackoverflow.com/questions/14950466/how-to-split-the-name-string-in-mysql by cc-by-sa and MIT license