[mysql] mysql에서 이름 문자열을 분할하는 방법은 무엇입니까?

mysql에서 이름 문자열을 분할하는 방법은 무엇입니까?

예 :

name
-----
Sachin ramesh tendulkar
Rahul dravid

다음과 같이 이름을 분할합니다 firstname,middlename,lastname.

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



답변

이 답변을 두 가지 방법으로 분리했습니다. 첫 번째 방법은 전체 이름 필드를 이름, 중간 및 성으로 구분합니다. 중간 이름이 없으면 중간 이름이 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
   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


답변

글쎄, 내가 사용한 것은 아무것도 없었기 때문에 정말 간단한 분할 함수를 만들기로 결정했습니다.

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;


답변

내가 사용하는 분할 기능은 다음과 같습니다.

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


답변

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   |
+-------+


답변

bewlo one도 사용할 수 있습니다.

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


답변

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


답변

공백 구분 기호의 두 번째 인스턴스 뒤에있는 나머지 문자열을 가져 오려면

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