Question

Without using PL/SQL, is it possible to do data masking in SELECT statement?

For example:

(AS-IS) SELECT 'this is a string' from DUAL;

this is a string

(TO-BE) SELECT 'this is a string' from DUAL;

xxxx xx x xxxxxx

Was it helpful?

Solution

REGEXP_REPLACE can do this:

SELECT REGEXP_REPLACE('this is a string', '\w', 'x') FROM DUAL;

This replaces all non-whitespace characters with an x. To replace letters only, try this:

SELECT REGEXP_REPLACE('this is a string', '[A-Za-z]', 'x') FROM DUAL;

OTHER TIPS

You can create user defined function as below and call that function in your query to mask the data.

create or replace function scrubbing(word in varchar2)
return varchar2
as
each_var char(2);
final_val varchar2(100);
complete_data varchar2(4000);
each_word varchar2(1000);
cursor val is select substr(replace(word,' ','#'),-level,1)  from dual connect by level<=length(word);
begin
open val;
--final_val:= '';
loop
    fetch val into each_var;
    exit when val%NOTFOUND;
    --dbms_output.put_line(each_var);
    final_val := trim(final_val)||trim(each_var);
    --dbms_output.put_line(final_val);
    select regexp_substr(final_val,'[A-Za-z]+') into each_word from dual;
    select replace(translate(final_val,each_word,dbms_random.string('L',length(word))),'#',' ') into complete_data from dual;
end loop;
return complete_data;
end;    
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top