개인정보 데이터를 추출하는 일이 종종 있었는데, 이를 마스킹 처리해서 추출해달라는 요청을 처음으로 받아 쿼리를 작성하는 겸 기록을 위해 포스팅을 작성한다.
1. 휴대폰번호 마스킹 처리
-- 결과값: 010****1234
SELECT
REPLACE(HP_NO, SUBSTRING(HP_NO, 4, 4), '****') AS 휴대폰번호
FROM DUAL
-- 결과값: 0101234****
SELECT
REPLACE(HP_NO, SUBSTRING(HP_NO, 8, 4), '****') AS 휴대폰번호
FROM DUAL
내가 데이터를 추출하는 테이블은 휴대폰번호를 01012345678 형태로 하이픈 없이 저장하고 있어 다음과 같이 쿼리를 작성했다. 휴대폰번호 사이에 하이픈이 있는 경우라면 SUBSTRING 함수의 parameter값만 변경해주면 될 듯 하다.
2. 이름 마스킹 처리
SELECT
-- 이름이 2, 3글자인 경우 두 번째 글자를 마스킹함.
-- 출력 결과: 김*, 홍*동
CASE WHEN CHAR_LENGTH(CUST_NM) <= 3
THEN REPLACE(CUST_NM, SUBSTRING(CUST_NM, 2, 1), '*')
-- 이름이 4글자 이상인 경우 첫 글자와 마지막 글자를 남기고 모두 마스킹함.
-- 출력 결과: 가**라, 가***마, A*****G
WHEN CHAR_LENGTH(CUST_NM) > 3
THEN REPLACE(CUST_NM, SUBSTRING(CUST_NM, SUGSTRING(CUST_NM, CHAR_LENGTH(CUST_NM) - 2),
REPEAT('*', CHAR_LENGTH(CUST_NM) - 2))
END AS 고객이름
FROM DUAL
처음에는 한국인 대부분의 이름이 세 글자라고 생각하고 단순히 이름 컬럼의 두 번째 값을 마스킹처리하려고 했었다. 하지만 실제 이름 데이터들을 확인해보니 두 글자 이름도 많고 네 글자, 심지어는 다섯 글자 이상인 이름 (외국인 이름... ) 도 많아 경우를 두 가지 (이름이 3글자 이하인 경우 / 이름이 4글자 이상인 경우) 로 나누어 쿼리를 작성했다.
정규식으로 처리하는 경우도 있다고 하는데, 정규식을 극도로 싫어하기도 하고 단순히 데이터 추출만을 위한 마스킹이기 때문에 SQL 함수나 정규식을 사용하지 않고 SELECT 문에 바로 작성했다. 실제로 웹 화면이나 서버 쪽에서 이용되는 데이터를 마스킹해야 할 경우에는 정규식을 사용해야 할 듯 하다.
'공부 > SQL' 카테고리의 다른 글
[MySQL] 여러 row의 데이터를 한 row에 합치기 - GROUP_CONCAT (0) | 2022.09.13 |
---|---|
[AWS RDS, MySQL] AWS RDS MySQL에서 이모티콘 사용하기 (0) | 2022.06.30 |