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 ;
한글 유니코드값을 이용한 쿼리입니다.
제 PC의 오라클 언어셋이 MSWIN949 입니다.
UNISTR 으로 유니코드로 바꾼 뒤 ASCII 값을 추출합니다..
'가' 에 해당하는 유니코드값이 44032 입니다.
'가' 에 붙일 수 있는 받침이 27 개입니다.
받침 없는 '가'까지 포함하면 총 28 가지가 됩니다.
'가' 다음으로 모음만 변경해 보면, 가능한 모음이 총 21가지 입니다.
즉, 초성 'ㄱ' 으로 시작하는 글자는 총 (28*21) 개가 됩니다.
FLOOR((ASCII(UNISTR(SUBSTR(nm, lv, 1))) - 44032) / (28*21)) + 1
이는 초성의 번호를 구하는 식이 됩니다.
- 초성 : 'ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ'
- 중성 : 'ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ'
- 종성 : 'ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ'
마농님 죄송한데요..-_-;;;
만들어주신 SQL을 잘 사용하고 있었는데, 기존 운영데이터를 백만껀 마이그레이션 하던중에
고객성명칼럼에서 에러가 나네요.. 분명히 중국인 한자 이름 또는 특수문자일것같은데..
그런Row를 피해서 skip 해 나갈 방법을 찾고있습니다.
에러는 Ora-30186 '\'뒤에 4개의 16진 문자나 다른 '\'이 와야함... 이런에러인데..
CASE WHEN REGEXP_LIKE ( CUST_NM, '^[가-힝]') THEN
(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)
)
와 같이 ^[가-힝] 한글인경우만 처리하라고 해도 에러가 나네요..