[SQL] 어떻게 MySQL의에서 이름 문자열을 분할하는?
SQL어떻게 MySQL의에서 이름 문자열을 분할하는?
어떻게 MySQL의에서 이름 문자열을 분할하는?
예 :. :
name
-----
Sachin ramesh tendulkar
Rahul dravid
FIRSTNAME, 가운데 이름, LASTNAME 같은 이름을 분할 :
firstname middlename lastname
--------- ------------ ------------
sachin ramesh tendulkar
rahul dravid
해결법
-
==============================
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.음, 아무것도 내가 일하지 사용, 내가 진짜 간단한 분할 기능을 만들기로 결정, 그래서 그것이 도움이되기를 바랍니다 :
음, 아무것도 내가 일하지 사용, 내가 진짜 간단한 분할 기능을 만들기로 결정, 그래서 그것이 도움이되기를 바랍니다 :
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.다음은 분할 기능 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.또한 하나 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.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.
select (case when locate('(', LocationName) = 0 then horse_name else left(LocationName, locate('(', LocationName) - 1) end) as Country from tblcountry;
-
==============================
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.
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.
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.우리는 하나의 열 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.공간 구분의 두 번째 인스턴스 후 문자열의 나머지를 얻으려면 :
공간 구분의 두 번째 인스턴스 후 문자열의 나머지를 얻으려면 :
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.당신은 common_schema를 사용하고 토큰 화 기능을 사용할 수 있습니다. 이 문제에 대한 자세한 내용은 링크를 따르십시오. 당신의 코드처럼 끝날 것입니다 :
당신은 common_schema를 사용하고 토큰 화 기능을 사용할 수 있습니다. 이 문제에 대한 자세한 내용은 링크를 따르십시오. 당신의 코드처럼 끝날 것입니다 :
토큰 화 (이름, '')를 호출;
그러나, 공간 이름과 성을위한 신뢰할 수있는 분리 아님을주의해야합니다. 예를 들면 스페인은 마지막 두 이름을 가지고하는 것이 일반적입니다.
-
==============================
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.먼저 다음과 같이 절차를 만듭니다 :
먼저 다음과 같이 절차를 만듭니다 :
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.문자열의 일부를 반환하는 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.
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
from https://stackoverflow.com/questions/14950466/how-to-split-the-name-string-in-mysql by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 문자열을 저장하는 데이터 유형 "텍스트"를 사용하는 모든 단점? (0) | 2020.03.15 |
---|---|
[SQL] PreparedStatement의에하여 setDate 사용 (0) | 2020.03.15 |
[SQL] ORDER BY에서 행 위치를 얻을 MYSQL (0) | 2020.03.14 |
[SQL] 나는 작은 따옴표와 주변 사용자 입력을 단일 따옴표를 이스케이프 SQL 주입에 대해 보호 할 수 있습니까? (0) | 2020.03.14 |
[SQL] 은 IN 값 목록 BY ORDER (0) | 2020.03.14 |