사용자 이름 출력시 이름만 마킹하기 0 2 1,836

by Kyle 이름 마킹 마스크 [2016.08.03 11:38:08]


아래 질문사항을 보다가 호기심에 한번 생각해 봤습니다

사용자 정보중 성명 필드가 하나인경우 화면 출력시에 이름만 (성은 정상출력) 가려줄경우 어떻게 하면 좋을까?

라는 생각이 들었습니다. 

일반적으로 이름은 성(1자리) + 이름(2자리) 이지만, 2자리 이상의 성을 가진 사람도 있고 이름도 긴경우가

많아서 이름만 가리고 보여주는 것에 대해 저는 아래와 같이 생각해 봤는데 뭔가 깔끔해 보이지가 않아서

다른 분들은 어떻게 생각할까 하고 올려 봅니다.

저는 성의 경우 2자리 이상의 성은 별도로 관리하고 그외는 전부 1자리 성이라는 가정하에 짜봤습니다.

 


WITH T1 AS(
    SELECT '김이' FAMILY_NAME FROM DUAL UNION ALL
    SELECT '황보' FAMILY_NAME FROM DUAL 
), T2 AS (
    SELECT '홍길동' NAME FROM DUAL UNION ALL
    SELECT '황보서' NAME FROM DUAL UNION ALL
    SELECT '김이남' NAME FROM DUAL UNION ALL
    SELECT '황보길동' NAME FROM DUAL UNION ALL
    SELECT '홍길북' NAME FROM DUAL 
)
SELECT 
    CASE
        WHEN (
                SELECT COUNT(*)
                FROM T1
                WHERE REGEXP_LIKE(T2.NAME, '^' || T1.FAMILY_NAME )
            ) >= 1
            THEN RPAD(
                SUBSTR(T2.NAME, 0, (
                    SELECT LENGTH(T1.FAMILY_NAME)
                    FROM T1
                    WHERE REGEXP_LIKE(T2.NAME, '^' || FAMILY_NAME )
                    )
                )
            ,LENGTH(T2.NAME)+2, '*')
        ELSE RPAD(SUBSTR(T2.NAME, 0, 1), LENGTH(T2.NAME)+1, '*')
    END NAME1
FROM T2

 

 

 

by 마농 [2016.08.03 13:16:47]

서브쿼리 반복 사용 보다는 조인이 좋습니다.

SELECT name
     , x || LPAD('*', LENGTH(name) - LENGTH(x), '*') name_mask
  FROM (SELECT a.name
             , NVL(b.family_name, SUBSTR(a.name, 1, 1)) x
          FROM t2 a
             , t1 b
         WHERE a.name LIKE b.family_name(+)||'%'
        )
;

 


by Kyle [2016.08.03 16:34:27]

역시 제가 쓴것보다는 깔끔하네요...ㅎ

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