혹시, 고객성명중 한글초성을 바로 뽑아내는 sql은 없을까요? 1 9 5,044

by 공기 [Oracle 기초] [2018.11.28 11:05:15]


안녕하세요...

홍길동이라고  고객마스터  테이블에  insert입력한다고 했을때,

sql로  바로  "ㅎㄱㄷ" 을 뽑아내는  쿼리  없을까요??

java에서 하는 소스는  더러 있지만.. 쿼리로 한방에  해결하면 좋을듯해서...

 

아시는 분 힌트 좀 주시면 감사하겠습니다..

 

 

by 마농 [2018.11.28 13:15:55]
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
;

 


by 공기 [2018.11.28 15:36:58]

아이고 마농님 감사합니다.  감사를 표할 방법도 없고... ㅎ

(고민되던 이슈였는데 단박에 해결을 해주시네요....ㅠ)


by 고기브페 [2018.11.29 11:57:51]

신기 방기한 쿼리...


by 고기브페 [2018.11.29 12:07:32]

마농님 죄송하지만 위에 쿼리 올려 주신거에서 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
이는 초성의 번호를 구하는 식이 됩니다.
- 초성 : 'ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ'
- 중성 : 'ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ'
- 종성 : 'ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ'


by 고기브페 [2018.11.29 14:24:32]

마농님 좋은 공부 거리와 정보 알려 주셔서 감사 합니다!!!!

감동했어요 ㅠㅠ


by 공기 [2019.01.17 13:07:21]

마농님 죄송한데요..-_-;;;

만들어주신 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)

        )

와 같이  ^[가-힝]  한글인경우만  처리하라고 해도  에러가 나네요..


by 마농 [2019.01.17 13:21:21]

 

'\' 이 포함된 이름을 찾아 보세요.

SELECT *
  FROM t
 WHERE cust_nm LIKE '%\%'
;

 


by 공기 [2019.01.17 13:47:20]

헉... 그생각은 못했습니다..

'\' 라는게  분명히  (프로그램의)이스케이프 문자라든지  그런걸꺼라고 생각했기때문에..

말씀대로 조회해보니,  실제로  이름뒤에  '\'  이렇게  붙어있네요....

이거때문에  오전내내  헤매고 있었습니다...ㅠㅠ  (아까 답변주신  프로시져 익셉션 skip도  이문제 해결을 위해서..ㅎ)

p.s.

와~~~잘되네요..  전에도 한번 말씀드렸는데.. ㅎ 예전에 한전에서 일하면서 kdn분들하고 여러번 일했었습니다.ㅎ

도움 너무 감사합니다..

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입