如何在使用 sql 函数在表中显示名称时使用掩码
How to use masks while displaying names in tables using sql fuctions
如果记录 [name surname] 除了前两个字母必须被屏蔽
如果记录[name name surname]第二个名字也必须屏蔽
如果 name 和 surname 只有 2 个字母,则没有任何变化
你可以试试这个。我不太确定 oracle 将如何处理此查询。
select concat(substr(fn,1,2),replicate("x",len(fn)-2)," ",substr(ln,1,2),replicate("x",len(ln)-2)) as CUSTOMER_NAME_SURNAME
from (select substr(CUSTOMER_NAME_SURNAME, 1, instr(CUSTOMER_NAME_SURNAME," ")) as fn,
substr(CUSTOMER_NAME_SURNAME, -1, instr(CUSTOMER_NAME_SURNAME," ", -1)) as ln
from table_name)
或者,我最好的选择是将名称拆分为其他 table 并使用带复制的子字符串。然后连接名称。但这会让它变得混乱,而且不止一个 table,我猜。
此外,对于中间名,您可以使用
substr(CUSTOMER_NAME_SURNAME, instr(CUSTOMER_NAME_SURNAME," ")+1, instr(CUSTOMER_NAME_SURNAME," ",1,2)-1) as mn
然后在 fn、mn 和 ln 中使用 CASE WHEN。
您可以使用 REGEXP_REPLACE 并提供 REGEX 表达式
例如:替换从第三个位置开始的所有字符。
SELECT
REGEXP_REPLACE(customer_name, '(\w+)', '*', 3) "REGEXP_REPLACE"
FROM myTable;
SELECT
(INITCAP(SUBSTR(SUBSTR(TRIM(CUSTOMERNAME),1,instr(TRIM(CUSTOMERNAME),chr(32),1,1)-1),1,2))||
REGEXP_REPLACE(SUBSTR(SUBSTR(TRIM(CUSTOMERNAME),1,INSTR(TRIM(CUSTOMERNAME),chr(32),1,1)-1),3),'(.)','*')||chr(32)||
REGEXP_REPLACE(SUBSTR(TRIM(CUSTOMERNAME),
INSTR(TRIM(CUSTOMERNAME),chr(32),1,1)+1,INSTR(TRIM(CUSTOMERNAME),chr(32),-1,1)-INSTR(TRIM(CUSTOMERNAME),chr(32),1,1)-1),'(.)','*'))||
initcap(SUBSTR(SUBSTR(TRIM(CUSTOMERNAME),INSTR(TRIM(CUSTOMERNAME),chr(32),-1,1)+1),1,2))||
REGEXP_REPLACE(SUBSTR(SUBSTR(TRIM(CUSTOMERNAME),INSTR(TRIM(CUSTOMERNAME),chr(32),-1,1)+1),3),'(.)','*')
AS CUSTOMERNAME FROM HR.CUSTOMERS;
如果记录 [name surname] 除了前两个字母必须被屏蔽
如果记录[name name surname]第二个名字也必须屏蔽
如果 name 和 surname 只有 2 个字母,则没有任何变化
你可以试试这个。我不太确定 oracle 将如何处理此查询。
select concat(substr(fn,1,2),replicate("x",len(fn)-2)," ",substr(ln,1,2),replicate("x",len(ln)-2)) as CUSTOMER_NAME_SURNAME
from (select substr(CUSTOMER_NAME_SURNAME, 1, instr(CUSTOMER_NAME_SURNAME," ")) as fn,
substr(CUSTOMER_NAME_SURNAME, -1, instr(CUSTOMER_NAME_SURNAME," ", -1)) as ln
from table_name)
或者,我最好的选择是将名称拆分为其他 table 并使用带复制的子字符串。然后连接名称。但这会让它变得混乱,而且不止一个 table,我猜。
此外,对于中间名,您可以使用
substr(CUSTOMER_NAME_SURNAME, instr(CUSTOMER_NAME_SURNAME," ")+1, instr(CUSTOMER_NAME_SURNAME," ",1,2)-1) as mn
然后在 fn、mn 和 ln 中使用 CASE WHEN。
您可以使用 REGEXP_REPLACE 并提供 REGEX 表达式
例如:替换从第三个位置开始的所有字符。
SELECT
REGEXP_REPLACE(customer_name, '(\w+)', '*', 3) "REGEXP_REPLACE"
FROM myTable;
SELECT
(INITCAP(SUBSTR(SUBSTR(TRIM(CUSTOMERNAME),1,instr(TRIM(CUSTOMERNAME),chr(32),1,1)-1),1,2))||
REGEXP_REPLACE(SUBSTR(SUBSTR(TRIM(CUSTOMERNAME),1,INSTR(TRIM(CUSTOMERNAME),chr(32),1,1)-1),3),'(.)','*')||chr(32)||
REGEXP_REPLACE(SUBSTR(TRIM(CUSTOMERNAME),
INSTR(TRIM(CUSTOMERNAME),chr(32),1,1)+1,INSTR(TRIM(CUSTOMERNAME),chr(32),-1,1)-INSTR(TRIM(CUSTOMERNAME),chr(32),1,1)-1),'(.)','*'))||
initcap(SUBSTR(SUBSTR(TRIM(CUSTOMERNAME),INSTR(TRIM(CUSTOMERNAME),chr(32),-1,1)+1),1,2))||
REGEXP_REPLACE(SUBSTR(SUBSTR(TRIM(CUSTOMERNAME),INSTR(TRIM(CUSTOMERNAME),chr(32),-1,1)+1),3),'(.)','*')
AS CUSTOMERNAME FROM HR.CUSTOMERS;