마스킹처리(치환)1 0 4 2,187

by 제임스 [SQL Query] [2014.07.25 09:45:20]


가변적인 치환룰에 따라 원데이타와 같은 위치에서  '*' 로 마스킹처리 해주는 쿼리가 필요합니다.

예를들면)

원 데이타    ==> HONGKILDONG

치환되는 룰 ==>  *123**6789*     (숫자는 의미없음)   ,결과 ==>   *ONG**LDON*

치환되는 룰 ==>  012**567*90     (숫자는 의미없음)   ,결과 ==>   HON**ILD*NG

~~

 

치환되는룰에 따라 결과를 달리 얻고자 합니다.(하드코딩이 아닌 치횐되는 룰을 자동으로 원데이타에 맵핑하여 가져올수 있는 방법이 필요)

고수님들의 답변쿼리 부탁해요..

 

 

 

 

by 김치찌게 [2014.07.25 10:23:22]
with T as
(
  select 'HONGKILDONG' as names from dual
),
R as
(
  --select '*123**6789*' keys from dual
  select '123**567*90' keys from dual
)
select listagg(result_names,'') within group (order by rownum) as result
from
(
  select case when substr(keys,level,1) = '*' then '*' else substr(T.names,level,1) end as result_names
  from R, T
  connect by level <= length(names)
)
/

마스킹이 * 이고,.. 무식하게 만들면 위처럼 되지 않을까요.. 


by 우리집아찌 [2014.07.25 10:25:35]

정규식으로 되지 않을까요?


by 비주류 [2014.07.25 10:37:48]
-- 더 좋은 방법이 있을 것 같지만.. 일단 올려봅니다.
WITH
RULE AS (
    SELECT 1 RN, '.(...)..(.{4}).'   PAT, '*\1**\2*'  REP FROM DUAL UNION ALL -- *123**6789*
    SELECT 2 RN, '(...)..(...).(..)' PAT, '\1**\2*\3' REP FROM DUAL           -- 012**567*90
),
DATA AS (
    SELECT 1 DN, 'HONGKILDONG' VAL FROM DUAL UNION ALL
    SELECT 2 DN, 'ABCDEFGHIJK' VAL FROM DUAL UNION ALL
    SELECT 3 DN, '12345678901' VAL FROM DUAL
)
SELECT  RN, DN, REGEXP_REPLACE(VAL, PAT, REP)
FROM    RULE, DATA

 


by 백면서생 [2014.07.26 13:51:00]
-- 재미삼아 reculsive
with t# as
(
select 'HONGKILDONG' i_str, '*123**6789*' fmt FROM dual
),
t(no, o_str, i_str, fmt) AS 
(  
select 1 no, cast (case when substr(fmt,1,1) = '*' then substr(fmt,1,1) else substr(i_str,1,1) end as varchar2(4000))o_str, i_str, fmt from t#
 union all
select no + 1 as no, o_str||case when substr(fmt,no+1,1) = '*' then substr(fmt,no+1,1) else substr(i_str,no+1,1) end o_str, i_str, fmt
  from t 
 where no < length(i_str) 
) 
select i_str,fmt,o_str  from t where no = length(i_str);


-- 시간남아 model
select i_str,fmt,o_str From dual
model
dimension by (1 X)
measures (0 N,'HONGKILDONG' i_str, '*123**6789*' fmt, cast('' as varchar2(4000)) o_str )
rules iterate (100) until (N[1] = length(i_str[1]))
( 
  o_str[1] = case when ITERATION_NUMBER > 1 then o_str[1] end
            ||case when substr(fmt[1],ITERATION_NUMBER,1) = '*' then 
                      substr(fmt[1],ITERATION_NUMBER,1) 
                   else substr(i_str[1],ITERATION_NUMBER,1) 
              end
)

 

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