Atomic Habits

[SQL] 한글 초성 추출 본문

IT/etc

[SQL] 한글 초성 추출

체계성 2021. 11. 6. 00:31
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, 1, 1) 
            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; 


-- 실행은 아래와 같이 한다.
--select
--fn_choSearch('홍길동')
--FROM dual;

 

 

WITH t AS
(
SELECT 1 id, '홍길동' nm FROM dual
UNION ALL SELECT 2, '마농' FROM dual
UNION ALL SELECT 3, '구루비' FROM dual
UNION ALL SELECT 4, '허거덩' FROM dual
)
SELECT id, nm
     , LISTAGG(x) WITHIN GROUP(ORDER BY lv) nm1
  FROM (SELECT id, lv, nm
             , SUBSTR('ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ'
               , FLOOR((ASCII(UNISTR(SUBSTR(nm, lv, 1))) - 44032) / (28*21)) + 1
               , 1) x
          FROM t
             , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 9)
         WHERE lv <= LENGTH(nm)
        )
 GROUP BY id, nm
;

 

마농님 죄송하지만 위에 쿼리 올려 주신거에서 ASCII 값에 - 44032 를 하신것과 / 28 *21 을 하여야 하는 이유 설명 해주실수 있나요?

신기해서 보고 분석 해보고 있는데 아는 지식이 부족하다보니 원리 파악을 못하고 있어서요


by 마농 [2018.11.29 13:36:13]

 

한글 유니코드값을 이용한 쿼리입니다.
제 PC의 오라클 언어셋이 MSWIN949 입니다.
UNISTR 으로 유니코드로 바꾼 뒤 ASCII 값을 추출합니다..
'가' 에 해당하는 유니코드값이 44032 입니다.
'가' 에 붙일 수 있는 받침이 27 개입니다.
받침 없는 '가'까지 포함하면 총 28 가지가 됩니다.
'가' 다음으로 모음만 변경해 보면, 가능한 모음이 총 21가지 입니다.
즉, 초성 'ㄱ' 으로 시작하는 글자는 총 (28*21) 개가 됩니다.


FLOOR((ASCII(UNISTR(SUBSTR(nm, lv, 1))) - 44032) / (28*21)) + 1
이는 초성의 번호를 구하는 식이 됩니다.
- 초성 : 'ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ'
- 중성 : 'ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ'
- 종성 : 'ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ'

 

출처 : http://www.gurubee.net/article/80544

'IT > etc' 카테고리의 다른 글

[Plugin] VScode유틸리티/플러그인  (0) 2021.11.14
[SQL] PNU-XY 테이블 문제  (0) 2021.11.07
[SQL] ROWNUM, ROWID  (0) 2021.11.06
들을 예정  (0) 2021.10.24
특수기호 읽기  (0) 2021.10.09
Comments