회사에서는 PostgreSQL을 사용하는데, 아직 포스트그레는 레퍼런스가 없어서 많이 애를 먹었다..
자동완성 검색 기능을 구현하기 위해 한글 자모를 분리한 후 두 키워드를 비교하여 포함 여부를 판단할 수 있도록 한글 자모가 분리된 문자열을 리턴받는 함수를 만들었다.
함수 생성
CREATE OR REPLACE FUNCTION octopus.fn_decompose_hangul(input_text text)
RETURNS text
LANGUAGE plpgsql
AS $function$
DECLARE
CHO text[] = ARRAY['ㄱ', 'ㄲ', 'ㄴ', 'ㄷ', 'ㄸ', 'ㄹ', 'ㅁ', 'ㅂ', 'ㅃ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅉ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ'];
JUNG text[] = ARRAY['ㅏ', 'ㅐ', 'ㅑ', 'ㅒ', 'ㅓ', 'ㅔ', 'ㅕ', 'ㅖ', 'ㅗ', 'ㅘ', 'ㅙ', 'ㅚ', 'ㅛ', 'ㅜ', 'ㅝ', 'ㅞ', 'ㅟ', 'ㅠ', 'ㅡ', 'ㅢ', 'ㅣ'];
JONG text[] = ARRAY['', 'ㄱ', 'ㄲ', 'ㄳ', 'ㄴ', 'ㄵ', 'ㄶ', 'ㄷ', 'ㄹ', 'ㄺ', 'ㄻ', 'ㄼ', 'ㄽ', 'ㄾ', 'ㄿ', 'ㅀ', 'ㅁ', 'ㅂ', 'ㅄ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ'];
result text = '';
current_char_code integer;
current_cho integer;
current_jung integer;
current_jong integer;
BEGIN
FOR i IN 1..length(input_text) LOOP
current_char_code := ascii(substring(input_text from i for 1)) - 44032;
IF current_char_code >= 0 AND current_char_code < 11172 THEN
current_cho := current_char_code / (21 * 28);
current_jung := (current_char_code - (current_cho * 21 * 28)) / 28;
current_jong := current_char_code - (current_cho * 21 * 28) - (current_jung * 28);
result := result || CHO[current_cho + 1] || JUNG[current_jung + 1] || JONG[current_jong + 1];
ELSE
result := result || substring(input_text from i for 1);
END IF;
END LOOP;
RETURN result;
END;
$function$
;
활용
select fn_decompose_hangul('안녕하세요');
조회 결과 : ㅇㅏㄴㄴㅕㅇㅎㅏㅅㅔㅇㅛ
* 한글 자모 분리는 아래 게시글을 참고해서 만들었다.
https://leesumin.tistory.com/78
'개발공부 > SQL' 카테고리의 다른 글
[ORACLE] 특수문자 찾기/특수문자 치환하기/특수문자 정규식 (0) | 2023.03.31 |
---|---|
[ORACLE] 숫자 외의 데이터가 있는 필드 찾기(하이픈 포함 여부) (0) | 2023.02.14 |
[ORACLE] 값이 한글로 되어있는 데이터 찾기 (0) | 2023.02.14 |
[ORACLE] 함수(Function) 찾기 (0) | 2023.02.14 |
[ORACLE] DB에 저장된 HTML태그 제거 (0) | 2022.10.27 |
댓글