안녕하세요. 문자열 처리 관련해서 도움을 부탁드립니다.
미리 감사드립니다.
입력값 출력값
—————- ——————
홍길동 ==> 홍*동
database ==> da****se
김수로왕 ==> 김**왕
select ‘홍길동’ a from dual union all
select ‘database’ a from dual union all
select ‘김수로왕’ a from dual
with t AS ( select '홍길동' a from dual union all select 'database' a from dual union all select '김수로왕' a from dual ) select substrb(a,1,2) || lpad('*',length(a)-length(substrb(a,1,2) ||substrb(a, lengthb(a)-1, 2)),'*') || substrb(a, lengthb(a)-1, 2) from t 한글이 2byte로 설정되었을때 예 입니다. 한글과 영어가 글자 단위가 아니라서 약간 복잡하네요 ^^
입출력 예시가 좀 더 다양했으면 좋겠네요. 한글 이름 중에 2글자 짜리는 없는지? 혹시 1글자는 없는지? 영문이 4글자 이하로 되는 경우 어떤 결과가 나와야 하는지? 영문과 한글이 섞여 있는 경우는 없는지? DB Character set 에도 영향을 받을 것 같습니다.
한글 이름 중에 2글자 짜리는 없는지? 혹시 1글자는 없는지?
=> 실제 고객이름이라서 1글자는 없을것 같습니다.
=> 2글자는 존재합니다. 이땐 뒷글자를 * 로 처리했으면 좋겠습니다.
영문이 4글자 이하로 되는 경우 어떤 결과가 나와야 하는지?
=> 4글자일 경우엔 뒷 2글자를 ** 로 처리했으면 좋겠습니다.
영문과 한글이 섞여 있는 경우는 없는지?
=> 사례는 없는것 같습니다만, 영문의 경우 공백은 들어갈 것 같습니다.
=> 만약 둘이 섞여 있다면 한글이 깨지진 않았으면 좋겠습니다만, 이 내용은 무시하셔도 될것 같습니다.
(만약 가능하다면, a홍길동 => a홍*동 이라고 표기되면 좋겠습니다.)
핸드폰으로 글을 쓰다보니, 작성에 제한이 있는것 같습니다. 읽어주셔서 감사합니다.
characterset 은 win949 입니다.
4글자 이하는 1,2,3,4 자리수를 의미합니다. 뒤 두글자 * 표시로는 표현이 모호합니다. 1글자짜리는 없다, 2글자면 어떻게 표현하고 싶다 이렇게 글로 이렇다 저렇다 쓰지 마시고 가능한 모든 경우에 대한 데이터를 입력 대비 출력값으로 쭈욱 보여주세요.
내용이 많이 부족했었던 것 같습니다. (위 댓글 중에 내용도 일부 변경된 사항을 기재했습니다.)
1. 데이터(성명) 처리방법
- 한글 : 홍길동 -> 홍*동, 김수로왕 -> 김**왕, 두글 -> 두*
- 영어 : database -> da****se, data -> da**, dat -> da*
- 특수기호 : da-ta -> da*ta, da ta -> da*ta, dat.a -> da*.a, data. -> da*a.
2. 입력조건
한글은 2글자 이상(4바이트) 입력, 영문은 3글자 이상(3바이트) 입력
3. 특수기호
점(‘.’), 하이픈(‘-‘), 공백(‘ ‘), 콤마(‘,’) 만 가능, 첫문자 특수기호 불가
마지막은 특수문자 가능, 단 공백은 사전 trim 함
다시 한번 감사드립니다.
* 핸드폰으로 입력이 까다로운 것 같습니다. ㅠ (사파리 기준) 다음엔 다른 브라우저로 글 작성하겠습니다.
WITH t AS ( SELECT '홍길동' v FROM dual --> 홍*동 UNION ALL SELECT '김수로왕' FROM dual --> 김**왕 UNION ALL SELECT '두글' FROM dual --> 두* UNION ALL SELECT 'database' FROM dual --> da****se UNION ALL SELECT 'data' FROM dual --> da** UNION ALL SELECT 'dat' FROM dual --> da* UNION ALL SELECT 'da-ta' FROM dual --> da*ta UNION ALL SELECT 'da ta' FROM dual --> da*ta UNION ALL SELECT 'dat.a' FROM dual --> da*.a UNION ALL SELECT 'data.' FROM dual --> da*a. ) SELECT v , CASE WHEN gb = 'kor' THEN SUBSTR(v, 1, 1) || CASE WHEN len = 2 THEN '*' ELSE LPAD('*', len-2, '*') || SUBSTR(v, -1) END WHEN gb = 'eng' THEN SUBSTR(v, 1, 2) || CASE WHEN len = 3 THEN '*' WHEN len = 4 THEN '**' ELSE LPAD('*', len-4, '*') || SUBSTR(v, -2) END END x FROM (SELECT v , CASE WHEN v > '가' THEN 'kor' ELSE 'eng' END gb , LENGTH(v) len FROM (SELECT TRIM(v) v FROM t) ) ;
진심으로 감사드립니다. 좋은 하루하루 되십시오.