안녕하세요? 가입하고 처음 질문 남깁니다.
오라클 A필드의 내용 기반으로 B필드 마스킹하는 방법 문의 드립니다.
프로시저로 만들어야 하는지 쿼리로 가능한건지 초보라 가늠이 안되요. 도움 주시면 고맙겠습니다.
1. 필드 구성
- content : 원문
- masking_rule : 마스킹 룰
2. making_rule 내용
- (마스킹 문자 시작 위치, 마스킹 문자 길이, 마스킹 유형)
3. 필드 내용
content: 안녕하세요 홍길동입니다. 전화번호는 022223333 입니다.
maksing_rule: (7,3,'이름')(20,9,'연락처')
동작 결과) 안녕하세요 ***입니다. 전화번호는 ********* 입니다.
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 ;