Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- createElement
- Let
- const
- input
- htmlFor
- 학습법 #집중력
- Append
- createtextnode
- appendChild
- boolean
- Openlayers
- FOR
- VAR
Archives
- Today
- Total
Atomic Habits
[SQL] 한글 초성 추출 본문
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
이는 초성의 번호를 구하는 식이 됩니다.
- 초성 : 'ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ'
- 중성 : 'ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ'
- 종성 : 'ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ'
'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