A필드의 내용 파싱하여 B 필드 마스킹 처리 문의 0 1 1,302

by 권영필 [Oracle 기초] 오라클 파싱 마스킹 [2017.10.22 10:19:32]


안녕하세요? 가입하고 처음 질문 남깁니다.

오라클 A필드의 내용 기반으로 B필드 마스킹하는 방법 문의 드립니다.

프로시저로 만들어야 하는지 쿼리로 가능한건지 초보라 가늠이 안되요. 도움 주시면 고맙겠습니다.

 

1. 필드 구성

- content : 원문

- masking_rule : 마스킹 룰

2. making_rule 내용

- (마스킹 문자 시작 위치, 마스킹 문자 길이, 마스킹 유형)

 

3. 필드 내용

 content: 안녕하세요 홍길동입니다. 전화번호는 022223333 입니다.

 maksing_rule: (7,3,'이름')(20,9,'연락처')

 

동작 결과) 안녕하세요 ***입니다. 전화번호는 ********* 입니다.

 

by 마농 [2017.10.23 09:30:40]
WITH content_t AS
(
SELECT 1 id, '안녕하세요 홍길동입니다. 전화번호는 022223333 입니다.' content FROM dual
)
, making_rule AS
(
SELECT 1 id, 7 pos, 3 len, '이름' nm FROM dual
UNION ALL SELECT 1, 21, 9, '연락처' FROM dual
)
SELECT id
     , content
     , LISTAGG(v1 || v2 || v3) WITHIN GROUP(ORDER BY pos) content_masking
  FROM (SELECT a.id
             , a.content
             , pos
             , DECODE( ROW_NUMBER() OVER(PARTITION BY b.id ORDER BY pos)
                     , 1, SUBSTR(content, 1, pos - 1) ) v1
             , LPAD('*', len, '*') v2
             , SUBSTR( content
                     , pos + len
                     , LEAD(pos, 1, 99) OVER(PARTITION BY b.id ORDER BY pos) - pos - len
                     ) v3
          FROM content_t a
             , making_rule b
         WHERE a.id = b.id
        )
 GROUP BY id, content
;
SELECT a.id
     , a.content
     , LISTAGG(NVL2(c.id, '*', SUBSTR(a.content, lv, 1))) WITHIN GROUP(ORDER BY b.lv) x
  FROM content_t a
 INNER JOIN (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 99) b
    ON b.lv <= LENGTH(a.content)
  LEFT OUTER JOIN making_rule c
    ON a.id = c.id
   AND b.lv BETWEEN c.pos AND c.pos + c.len - 1
 GROUP BY a.id, a.content
;

 

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