Database/SQL

Oracle 오라클 자음 초성 추출 함수, 자음으로 검색, 초성 검색

리커니 2016. 4. 18.
반응형

 

Oracle 오라클 자음 초성 추출 함수, 자음으로 검색, 초성 검색

 
개발을 하다보면 자음으로만 검색할 수 있게 해달라는 요청이 들어오곤 한다.

그럴때마다 유용하게 사용하는 것이 아래의 함수이다.

그냥 복사 붙여넣고 실행하면 함수가 생성된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
create or replace function fn_choSearch( str in varchar2) return varchar2 
is 
   returnStr varchar2(100);  
   cnt number := 0;  
   tmpStr varchar2(10); 
begin  
      if str is null then 
      return ''
      end if;  
 
      cnt := length(str);  
 
      for i in 1 .. cnt 
      loop 
        tmpStr := substr(str,i,1);        
      returnStr := returnStr || 
      case when tmpStr < 'ㄱ' then substr(tmpStr, 11
            when ascii('ㄱ'<= ascii(tmpStr) and ascii(tmpStr) <= ascii('ㅎ') then chr(ascii(tmpStr)) 
            when tmpStr < '나' then 'ㄱ' 
            when tmpStr < '다' then 'ㄴ' 
            when tmpStr < '라' then 'ㄷ' 
            when tmpStr < '마' then 'ㄹ' 
            when tmpStr < '바' then 'ㅁ' 
            when tmpStr < '사' then 'ㅂ' 
            when tmpStr < '아' then 'ㅅ' 
            when tmpStr < '자' then 'ㅇ' 
            when tmpStr < '차' then 'ㅈ' 
            when tmpStr < '카' then 'ㅊ' 
            when tmpStr < '타' then 'ㅋ' 
            when tmpStr < '파' then 'ㅌ' 
            when tmpStr < '하' then 'ㅍ' 
            else 'ㅎ' 
      end;  
      end loop; 
      return returnStr; 
end; 

cs

 

 

 

 

 

사용방법은 아래와 같다.

필자의 경우 웹페이지의 검색단에서 초성인지 아닌지 아래와 같이 구분을 하여

 

1
2
3
4
5
6
7
8
9
var keyword = $("#keyword").val().toUpperCase(); 
var choKeyword = choHangul($("#keyword").val());
 
//초성검색 구분 
if (keyword!="" && choKeyword==""){ 
    choDiv = 'Y'
}else
    choDiv = 'N'
cs

 

 

1
2
3
4
5
6
7
8
9
10
11
12
/* 초성추출 */ 
 
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; 
}
cs

 


sql 조건문에 활용하여 초성검색을 구현하였다.

 

1
2
3
4
5
6
7
8
WHERE 1=1 
 
<isEqual prepend='AND' property="choDiv" compareValue="N" > 
    S1.STOP_NAME LIKE '%'||#keyword#||'%' OR S1.STOP_ID LIKE '%'||#keyword#||'%' 
</isEqual> 
<isEqual prepend='AND' property="choDiv" compareValue="Y" > 
    fn_choSearch(S1.stop_name) LIKE '%'||#keyword#||'%' OR S1.STOP_ID LIKE '%'||#keyword#||'%' 
</isEqual> 
cs

 

choDiv 값이 N 일 경우 일반검색
choDiv 값이 Y 일 경우 위의 oracle함수를 사용하여 초성검색


예를 들어
이렇게 구현을 하면 'ㄱㄴㄷ' 으로 검색을 하면
가나다
간난단
갇낟닫
...
등 초성이 ㄱ,ㄴ,ㄷ 인 데이터가 검색된다.


Link : Mysql 자음 초성 추출 함수, 자음으로 검색, 초성 검색

 

Link : vanila javascript 개선된 초성검색 기능 구현

반응형

댓글

💲 추천 글