Database/SQL
Mysql 자음 초성 추출 함수, 자음으로 검색, 초성 검색
리커니
2016. 4. 18. 11:08
반응형
Mysql 자음 초성 추출 함수, 자음으로 검색, 초성 검색
개발을 하다보면 자음으로만 검색할 수 있게 해달라는 요청이 들어오곤 한다.
그럴때마다 유용하게 사용하는 것이 아래의 함수이다.
그냥 복사 붙여넣고 실행하면 함수가 생성된다. (해당 데이터베이스 명만 수정 : 아래는 gn)
CREATE DEFINER=`스키마`@`%` FUNCTION `fn_choSearch`(`str` varchar(20)) RETURNS varchar(20) CHARSET utf8
BEGIN
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 str = replace(str, ' ', '');
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;
사용방법은 아래와 같다.
필자의 경우 웹페이지의 검색단에서 초성인지 아닌지 아래와 같이 구분을 하여
var keyword = $("#keyword").val().toUpperCase();
var choKeyword = choHangul($("#keyword").val());
//초성검색 구분
if (keyword!="" && choKeyword==""){
choDiv = 'Y';
}else{
choDiv = 'N';
}
/* 초성추출 */
function choHangul(str) {
cho = ["ㄱ","ㄲ","ㄴ","ㄷ","ㄸ","ㄹ","ㅁ","ㅂ","ㅃ","ㅅ","ㅆ","ㅇ","ㅈ","ㅉ","ㅊ","ㅋ","ㅌ","ㅍ","ㅎ"];
result = "";
for(i=0;i<str.length;i++) {
code = str.charCodeAt(i)-44032;
if(code>-1 && code<11172) result += cho[Math.floor(code/588)];
}
return result;
}
sql 조건문에 활용하여 초성검색을 구현하였다.
WHERE 1=1
<isEqual prepend='AND' property="choDiv" compareValue="N" >
S1.STOP_NAME LIKE concat('%',#keyword#,'%') OR S1.STOP_ID LIKE concat('%',#keyword#,'%')
</isEqual>
<isEqual prepend='AND' property="choDiv" compareValue="Y" >
fn_choSearch(S1.stop_name) LIKE concat('%',#keyword#,'%') OR S1.STOP_ID LIKE concat('%',#keyword#,'%')
</isEqual>
choDiv 값이 N 일 경우 일반검색
choDiv 값이 Y 일 경우 위의 oracle함수를 사용하여 초성검색
예를 들어
이렇게 구현을 하면 'ㄱㄴㄷ' 으로 검색을 하면
가나다
간난단
갇낟닫
...
등 초성이 ㄱ,ㄴ,ㄷ 인 데이터가 검색된다.
/*초성 단어 검색의 경우 (공백 포함)*/
위에 있는 초성 검색의 경우 공백이 없는 경우 검색이 됩니다.
공백이 있는 경우는 아래의 Function 을 사용하세요.!
DROP FUNCTION IF EXISTS FNC_NTCN;
CREATE DEFINER=`CITSARCH`@`%` FUNCTION `FNC_NTCN`(str VARCHAR(2000)) RETURNS varchar(2000) CHARSET utf8
BEGIN
DECLARE rtrnStr VARCHAR(2000);
DECLARE cnt INT;
DECLARE i INT;
DECLARE j INT;
DECLARE tmpStr VARCHAR(2000);
DECLARE blankCnt INT;
set blankCnt = (char_length(str) - char_length(replace(str,' ','')))/2;
if str is null then
return '';
end if;
set cnt = ceil(length(str)/3) + blankCnt;
set i = 1;
set j = 1;
while i <=cnt DO
set tmpStr = substring(str,i,j);
set rtrnStr = concat(ifnull(rtrnStr,''),
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 'ㅍ'
when tmpStr rlike '^ㅎ' OR ( tmpStr >= '하' ) then 'ㅎ'
else ' ' end);
set i=i+1;
end while;
RETURN rtrnStr;
END;
Link : Oracle 오라클 자음 초성 추출 함수, 자음으로 검색, 초성 검색
Link : vanila javascript 개선된 초성검색 기능 구현
반응형