몽땅뚝딱 개발자

[SQL/Function] 초성검색 / 초성에 해당하는 데이터 찾기 본문

Development/DB

[SQL/Function] 초성검색 / 초성에 해당하는 데이터 찾기

레오나르도 다빈츠 2021. 6. 11. 13:00

◽ Function

CREATE DEFINER=`test`@`%` FUNCTION `fn_choSearch`(
	`str` varchar(20)
) RETURNS varchar(20) CHARSET utf8

BEGIN 
-- 초성검색 function
     declare returnStr varchar(100); 
     declare cnt int;
     declare i int;
     declare j int;
     declare tmpStr varchar(10);
 
     if str is null then 
         return ''; 
     end if; 

     set cnt = length(str)/3; 
     set i = 1; 
     set j = 1; 

     while i <=cnt DO 
           set tmpStr = substring(str,i,j); 
           set returnStr = concat(ifnull(returnStr,''), 

            case when tmpStr rlike '^(ㄱ|ㄲ)' OR ( tmpStr >= '가' AND tmpStr < '나' ) then 'ㄱ' 
                 when tmpStr rlike '^ㄴ' OR ( tmpStr >= '나' AND tmpStr < '다' ) then 'ㄴ' 
                 when tmpStr rlike '^(ㄷ|ㄸ)' OR ( tmpStr >= '다' AND tmpStr < '라' ) then 'ㄷ' 
                 when tmpStr rlike '^ㄹ' OR ( tmpStr >= '라' AND tmpStr < '마' ) then 'ㄹ' 
                 when tmpStr rlike '^ㅁ' OR ( tmpStr >= '마' AND tmpStr < '바' ) then 'ㅁ' 
                 when tmpStr rlike '^ㅂ' OR ( tmpStr >= '바' AND tmpStr < '사' ) then 'ㅂ' 
                 when tmpStr rlike '^(ㅅ|ㅆ)' OR ( tmpStr >= '사' AND tmpStr < '아' ) then 'ㅅ' 
                 when tmpStr rlike '^ㅇ' OR ( tmpStr >= '아' AND tmpStr < '자' ) then 'ㅇ' 
                 when tmpStr rlike '^(ㅈ|ㅉ)' OR ( tmpStr >= '자' AND tmpStr < '차' ) then 'ㅈ' 
                 when tmpStr rlike '^ㅊ' OR ( tmpStr >= '차' AND tmpStr < '카' ) then 'ㅊ' 
                 when tmpStr rlike '^ㅋ' OR ( tmpStr >= '카' AND tmpStr < '타' ) then 'ㅋ' 
                 when tmpStr rlike '^ㅌ' OR ( tmpStr >= '타' AND tmpStr < '파' ) then 'ㅌ' 
                 when tmpStr rlike '^ㅍ' OR ( tmpStr >= '파' AND tmpStr < '하' ) then 'ㅍ' 
            else 'ㅎ' end); 
           set i=i+1; 
     end while; 
  RETURN returnStr; 

END

 

 

◽ 실행예시

todo 테이블에서 contents 컬럼에 'ㅂㄹ'가 포함되어있는 행을 가져온다.

 

todo 테이블에 있는 데이터

 

SELECT * FROM todo WHERE fn_choSearch(todo.contents) like concat('%', 'ㅂㄹ', '%');

 

'ㅂㄹ'가 포함된 행이 조회되었다.

 

 

 

 


개인적으로 공부한 내용을 정리하는 블로그로
잘못된 개념을 게시하지않도록 주의하고 있으나 오류가 있을 수 있습니다.

 

 

Comments