티스토리 뷰

/*
자동완성 기능을 위해서 구현한 함수라서 종성을 모두 초성으로 치환하였습니다.

예를 들어 사용자가 "깐"이라고 입력한 시점에서
"까나리"를 검색하게 될지 "깐돌이"를 검색하게 될지 모르기 때문에
자동완성으로 보여줄 대상의 data의 종성을 초성으로 변환하여 반환하도록 구현했습니다.
*/


--user function: decomposition Hangul syllalble by key stroke 
ALTER FUNCTION [dbo].[uf_decom_syl_KS]( @chr NCHAR(1) )
RETURNS NVARCHAR(10)
AS
BEGIN
        DECLARE @cho INT;         -- chosung
        DECLARE @jung INT;        -- jungsung
        DECLARE @jungKS NVARCHAR(2); -- jungsung key stroke
        DECLARE @jong INT;        -- jongsung
        DECLARE @jongKS NVARCHAR(2); -- jongsung key stroke
        DECLARE @sylOffset INT;   -- offset from '가'
        DECLARE @Ret NVARCHAR(10);

        IF ( UNICODE(@chr) BETWEEN 0xAC00 AND 0xD7A3 )  -- between '가' and '힣'
        BEGIN
                SET @sylOffset = UNICODE(@chr) - 0xAC00;
                SET @cho = ( @sylOffset / (21*28) ) + 0x1100;
                SET @jung =  ( @sylOffset % (21*28) ) / 28 + 0x1161;
                SET @jungKS = CASE @jung
WHEN 0x116A THEN NCHAR( 0x1169 ) + NCHAR( 0x1161 ) -- ㅘ
WHEN 0x116B THEN NCHAR( 0x1169 ) + NCHAR( 0x1162 ) -- ㅙ
WHEN 0x116C THEN NCHAR( 0x1169 ) + NCHAR( 0x1175 ) -- ㅚ
WHEN 0x116F THEN NCHAR( 0x116E ) + NCHAR( 0x1165 ) -- ㅝ
WHEN 0x1170 THEN NCHAR( 0x116E ) + NCHAR( 0x1166 ) -- ㅞ
WHEN 0x1171 THEN NCHAR( 0x116E ) + NCHAR( 0x1175 ) -- ㅟ
WHEN 0x1174 THEN NCHAR( 0x1173 ) + NCHAR( 0x1175 ) -- ㅢ
ELSE NCHAR( @jung )
END
                SET @jong =  ( @sylOffset % 28 ) + 0x11A7;
                SET @jongKS = CASE @jong
WHEN 0x11A7 THEN '' 
WHEN 0x11A8 THEN NCHAR( 0x1100 ) -- ㄱ
WHEN 0x11A9 THEN NCHAR( 0x1101 ) -- ㄲ
WHEN 0x11AA THEN NCHAR( 0x11A8 ) + NCHAR( 0x11BA ) -- ㄳ
WHEN 0x11AB THEN NCHAR( 0x1102 ) -- ㄴ
WHEN 0x11AC THEN NCHAR( 0x11AB ) + NCHAR( 0x11BD ) -- ㄵ
WHEN 0x11AD THEN NCHAR( 0x11AB ) + NCHAR( 0x11C2 ) -- ㄶ
WHEN 0x11AE THEN NCHAR( 0x1103 ) -- ㄷ
WHEN 0x11AF THEN NCHAR( 0x1105 ) -- ㄹ
WHEN 0x11B0 THEN NCHAR( 0x1105 ) + NCHAR( 0x1100 ) -- ㄺ
WHEN 0x11B1 THEN NCHAR( 0x1105 ) + NCHAR( 0x1106 ) -- ㄻ
WHEN 0x11B2 THEN NCHAR( 0x1105 ) + NCHAR( 0x1107 ) -- ㄼ
WHEN 0x11B3 THEN NCHAR( 0x1105 ) + NCHAR( 0x1109 ) -- ㄽ
WHEN 0x11B4 THEN NCHAR( 0x1105 ) + NCHAR( 0x1110 ) -- ㄾ
WHEN 0x11B5 THEN NCHAR( 0x1105 ) + NCHAR( 0x1111 ) -- ㄿ
WHEN 0x11B6 THEN NCHAR( 0x1105 ) + NCHAR( 0x1112 ) -- ㅀ
WHEN 0x11B7 THEN NCHAR( 0x1106 ) -- ㅁ
WHEN 0x11B8 THEN NCHAR( 0x1107 ) -- ㅂ
WHEN 0x11B9 THEN NCHAR( 0x1107 ) + NCHAR( 0x1109 ) -- ㅄ
WHEN 0x11BA THEN NCHAR( 0x1109 ) -- ㅅ
WHEN 0x11BB THEN NCHAR( 0x110A ) -- ㅆ
WHEN 0x11BC THEN NCHAR( 0x110B ) -- ㅇ
WHEN 0x11BD THEN NCHAR( 0x110C ) -- ㅈ
WHEN 0x11BE THEN NCHAR( 0x110E ) -- ㅊ
WHEN 0x11BF THEN NCHAR( 0x110F ) -- ㅋ
WHEN 0x11C0 THEN NCHAR( 0x1110 ) -- ㅌ
WHEN 0x11C1 THEN NCHAR( 0x1111 ) -- ㅍ
WHEN 0x11C2 THEN NCHAR( 0x1112 ) -- ㅎ
END

                SET @Ret = NCHAR(@cho) + @jungKS + @jongKS;
        END
        ELSE
                SET @Ret = @chr;
        RETURN @Ret;
END

GO

--user function: decomposition string
CREATE FUNCTION dbo.uf_decom_str_KS( @str NVARCHAR(MAX) )
RETURNS NVARCHAR(MAX)
AS
BEGIN
        DECLARE @ii INT;
        DECLARE @lenStr INT;
        DECLARE @rtn NVARCHAR(MAX);

        SET @ii = 1;
        SET @lenStr = LEN( @str );
        SET @rtn = '';

        WHILE( @ii <= @lenStr )
        BEGIN
            SET @rtn = @rtn + dbo.uf_decom_syl_KS( SUBSTRING( @str, @ii, 1 ) );
            SET @ii = @ii + 1;
        END

        RETURN @rtn;
END
GO 


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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
글 보관함