CREATE DEFINER=`gn`@`%` 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 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;
}
쿼리에서 초성 추출하자.
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함수를 사용하여 초성검색
예를 들어 이렇게 구현을 하면 'ㄱㄴㄷ' 으로 검색을 하면 가나다 간난단 갇낟닫 ... 등 초성이 ㄱ,ㄴ,ㄷ 인 데이터가 검색된다.
함수: 여러 개의 statement를 하나로 묶은 단위 * 함수는 반복적 수행이 가능하며, 코드를 논리적으로 이해하는데 도움을 줌. 또한 코드의 일정 부분을 별도의 논리적 개념으로 독립화 가능
간단한 함수의 정의 → def: 함수 정의 시 사용하는 키워드
함수 객체와 함수 호출 * 함수 이름 자체는 함수 객체의 레퍼런스를 지님 * 함수 이름에 저장된 레퍼런스를 다른 변수에 할당하여 그 변수를 이용한 함수 호출 가능 * 함수 몸체에는 최소한 한 개 이상의 statement가 존재해야 함 (없으면 pass 사용)
함수 인수값 전달 방법 * 기본: 값에 의한 호출(call-by-value) → 실제로는 참조에 의한 호출(call-by-reference) * 함수 인자에 변경불가능 객체인 숫자값, 문자열, 튜플을 전달하면 의미 없음 * 함수 인자에 변경 가능한 객체인 리스트와 사전을 전달하면 올바른 전달법 및 활용법
- 반환문 : 인수 없이 return문 사용하면 None 객체 전달
- 함수 인자에 대한 동적인 자료형 결정 : 함수 인자는 함수가 호출되는 순간 해당 인자에 전달되는 객체에 따라 타입 결정
함수 인수 처리
기본 인수 값 : 함수를 호출할 때 인수를 넘겨주지 않아도 인수가 기본적으로 가지는 값 * incr(a, step=1)에서 step=1과 같은 형태를 가짐 * 함수 정의를 할 때 일반적인 인수 앞에 기본 인수 값 올 수 없으나 여러 개는 정의 가능
키워드 인수 : 인수 값 전달 시 인수 이름과 함께 값을 전달하는 방식 * 함수 호출 시 키워드 인수는 마지막에 위치해야 함
가변 인수 리스트 : 함수 정의 시 일반적인 인수 선언 뒤에 *var 형식의 인수로 가변 인수 선언 * var 에는 함수 호출 시 넣어주는 인수 값들 중 일반 인수에 할당되는 값을 제외한 나머지 값들을 지닌 튜플 객체가 할당됨 * C 언어의 printf문과 유사한 형태의 printf 정의 됨
튜플 인수와 사전 인수로 함수 호출하기 * 함수 호출 시 * 사용하고 뒤에 튜플을 넣으면 튜플 전체 호출 가능 * 함수 호출 시 ** 사용하고 뒤에 사전을 넣으면 사전 전체 호출 가능
들여쓰기와 제어문 - 파이썬은 들여쓰기를 강제하여 코드의 가독성을 높임 - 가장 바깥쪽 코드는 반드시 1열에 시작 - 블록 내부에 있는 statement들은 동일한 열에 위치해야 함 - 블록의 끝은 들여쓰기가 끝나는 부분으로 간주 - 파이썬에는 {. }. begin, end 등의 키워드가 존재하지 않음 - 들여쓰기를 할 때에는 탭과 공백을 섞어 쓰지 않음
if문 - if, elif, else문으로 쓰이나 elif와 else문은 꼭 필요하지는 않음 - 조건식이나 else 다음에 콜론(:) 표기 필요 - 들여쓰기를 잘 지켜야 함 if 조건식 1: statement elif 조건식 2: statement else: statement
for문 - 컨테이너 객체가 지닌 각 요소가 타겟에 들어감 - enumerate() 내장함수 : 컨테이너 객체가 지닌 각 요소값 뿐만 아니라 인덱스 값도 함께 반환 - break: 루프를 빠져나감 - continue: 루프 블록 내의 continue 이후 부분은 수행하지 않고 루프의 시작부분으로 이동 - else: 루프가 break에 의한 중단 없이 정상적으로 모두 수행되면 else 블록이 수행됨 - for 루프는 중첩으로 사용 가능 for <타겟> in <컨테이너 객체> statement else: statement
while문 - while 조건식이 만족하는 동안 while 블록내의 statements 들을 반복 수행
함수의 장점 및 함수 사용법 - 함수의 장점 : 반복적인 코드 사용을 없애 코드 길이를 짧게 만들고, 유지보수가 쉬워짐 - 함수 이름에 저장된 레퍼런스를 다른 변수에 할당하여 그 변수를 이용한 함수 호출 가능 - 함수의 몸체에는 최소 한 개 이상의 statement가 존재해야 함 따라서, 아무런 내용이 없는 몸체를 지닌 함수의 경우 pass 키워드를 몸체에 적는 것이 필요 - 함수에서 다른 함수 호출이 가능하며, 인자의 이름과 함께 인자 값 넘기는 것이 가능 - 인자의 디폴트 값을 지정할 수 있으며, 두 개 이상의 값을 동시 반환 가능
함수 호출 시 동적인 자료형 결정 - 파이썬에서 모든 객체는 동적으로 실행 시간에 그 타입이 결정됨
재귀적 함수 호출 - 재귀 함수: 함수 몸체에서 자기 자신을 호출하거나 1부터 n까지 더하는 함수 - 수학에서 점하식과 유사한 코드로 반드시 종결조건이 만족할 때 반환 값이 있어야 함