본문 바로가기
개발공부/SQL

[PL/PGSQL] 한글 자모 분리

by 양히◡̈ 2023. 9. 28.

회사에서는 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

 

한글 초성, 중성, 종성 분리하기

개발하면서 한글 문자를 초성, 중성, 종성으로 분리해야할 필요가 생겼는데요. 구글링하면서 알게된 내용을 정리해보려해요. 우선 한글은 유니코드라는 글로벌하게 약속된 체계에 의해 고유한

leesumin.tistory.com

 

댓글