REGEXP_REPLACE также может помочь. Вот как это сделать для электронной почты :
SELECT REGEXP_REPLACE(email, '(?!^).(?=[^@]+@)', '*') AS masked_email
FROM Employee;
Объяснение:
(?! ^) Мы убеждаемся, что соответствующий символ не находится в начале строки, и таким образом мы пропускаем первый символ.
. соответствует заменяемому символу
(? = [^ @] + @) мы остановимся на последовательности, которая представляет собой любой символ, который НЕ является @, за которым следует @.
Каждый отдельный Символ, который совпадает между этими двумя, затем будет заменен функцией на * (третий параметр).
Для номера телефона я покажу гораздо более простое решение:
SELECT REGEXP_REPLACE(phone, '[0-9]{3}$', '***') AS masked_phone
FROM Employee;
[0-9] {3} соответствует ровно трем цифрам.
$ указывает, что они должны быть в конце строки.
Затем мы заменяем их тремя звездочками . Обратите внимание, что это решение предполагает, что вы всегда храните телефонные номера таким образом, чтобы они всегда заканчивались тремя цифрами. Так, например, если я введу телефон типа «555-55-55-55», ничего не будет замаскировано. Если вы не всегда вставляете телефоны, нормализованные в одном и том же формате, тогда вы должны подумать о чем-то более сложном (например, fetch di git - получить ноль или более нецифровых чисел - fetch di git - получить ноль или более нецифровых чисел - fetch di git - конец строки, затем замените все, что совпадает с тремя * -с). Примерно так:
SELECT REGEXP_REPLACE(phone, '[0-9][^0-9]*[0-9][^0-9]*[0-9][^0-9]*$', '***') AS masked_phone
FROM Employee;
Здесь [0-9] означает один di git, а [^ 0-9] * означает ноль или более нецифровых цифр. И, конечно же, то же самое можно упростить, сгруппировав di git и ноль или более нецифровых цифр в одну группу, которая затем повторяется ровно три раза:
SELECT REGEXP_REPLACE(phone, '([0-9][^0-9]*){3}$', '***') AS masked_phone
FROM Employee;
И для name , мы можем сделать следующее:
SELECT REGEXP_REPLACE(name, '(?!^).(?=.+$)', '*') AS masked_name
FROM Employee;
Итак, мы снова пропускаем первый символ, затем сопоставляем и заменяем каждый символ до последнего символа в строке.
ВАЖНО: В приведенных выше примерах мы сохраняем длину строк. Если вам нужна более высокая анонимность, вы можете получать данные по группам, а затем заменять нужную группу одним файлом *. Например, для электронной почты:
SELECT REGEXP_REPLACE(email, '^(.)(.)+([^@]@.+)$', '\\1*\\3') AS masked_email
FROM Employee;
Это заменит john@gmail.dom на j *n@gmail.dom и margareth@gmail.dom на m *h@gmail.dom. Таким образом, он также замаскировал длину. Пояснение:
^ - начало строки.
(.) - наша первая группа. Это одиночный символ
(.) + - вторая группа. Это один или несколько символов.
([^ @] @. +) - наша третья группа. Это один символ НЕ @, за которым следует @, за которым следует один или несколько символов (любые).
Мы заменяем его на \ 1 (первая группа), за которым следует один *, за которым следует по \ 3 (третья группа).