我想屏蔽除最后四个字符之外的数据。
例如:
如果有一
varchar
列(名称)的值为Rio De janerio
,我想将其屏蔽为xxx xx xxxerio
。如果它是
numeric
具有值的列(acc number)123 453 6987
,那么我希望它显示为000 000 6987
。
我尝试使用正确和替换功能。但我找不到解决方案。
屏蔽除最后四个之外的数据characters/numbers
我想屏蔽除最后四个字符之外的数据。
例如:
如果有一varchar
列(名称)的值为Rio De janerio
,我想将其屏蔽为xxx xx xxxerio
。
如果它是numeric
具有值的列(acc number)123 453 6987
,那么我希望它显示为000 000 6987
。
我尝试使用正确和替换功能。但我找不到解决方案。
屏蔽除最后四个之外的数据characters/numbers
在 Oracle 上,您可以尝试以下查询以用 0 替换数字 -
SELECT REGEXP_REPLACE (SUBSTR('123 453 6987', 1, LENGTH('123 453 6987')-4), '\d', '0') || SUBSTR('123 453 6987', -4, 4) PROCESSED_STRING
FROM DUAL;
PROCESSED_STRING
000 000 6987
对于用#s 替换字符串 -
SELECT REGEXP_REPLACE (SUBSTR('Rio De janerio', 1, LENGTH('Rio De janerio')-4), '\S', '#') || SUBSTR('Rio De janerio', -4, 4) PROCESSED_STRING
FROM DUAL;
PROCESSED_STRING
### ## ###erio
这是小提琴。
使用 SQLSERVER STUFF() 和 PATINDEX() 将解决这个问题
为了掩盖名字
declare @str varchar(20)
declare @rcInt int
set @str ='Rio De janerio'
set @rcInt = 4;
with cte as
(select left(@str, len(@str)-@rcInt) as name
),
rn as
(select stuff(name, patindex('%[a-z]%',name), 1, 'X') as ch, patindex('%[a-z]%',name)as rn, name from cte
union all
select stuff(ch, rn+patindex('%[a-z]%',substring(name, rn+1, len(name))), 1, 'X') as ch, rn+patindex('%[a-z]%',substring(name, rn+1, len(name)))as rn, name from rn
where patindex('%[a-z]%',substring(name, rn+1, len(name)))>0
)
select top 1 ch + right(@str, @rcInt) from rn order by rn desc
电话号码(作为函数)
create function ufn_MaskPhoneNum(
@str varchar(20),
@rcInt int
)
returns @tblReturn table(maskedStr varchar(100))
as
begin
with cte as
(select left(@str, len(@str)-@rcInt) as name
),
rn as
(select stuff(name, patindex('%[0-9]%',name), 1, 'X') as ch, patindex('%[0-9]%',name)as rn, name from cte
union all
select stuff(ch, rn+patindex('%[0-9]%',substring(name, rn+1, len(name))), 1, 'X') as ch,
rn+patindex('%[0-9]%',substring(name, rn+1, len(name)))as rn, name from rn
where patindex('%[0-9]%',substring(name, rn+1, len(name)))>0
)
insert into @tblReturn
select top 1 ch + right(@str, @rcInt) from rn order by rn desc
return;
end
样本:
select * from ufn_MaskPhoneNum('123 453 6987', 4)
如果您使用的是 SQL Server 2016 及更高版本,则可以使用 Translate 功能:
declare @name varchar(50) = 'Rio De janerio'
select translate(substring(@name,1,len(@name)-4),'abcdefghijklmnopqrstuvwxyz','**************************') + right(@name,4)
declare @i int = 1234536987
select translate(substring(convert(varchar(50),@i),1,len(@i)-4),'0123456789','0000000000') + right(@i,4)
这不是一个完整的解决方案,但它只是一个想法和一个提示,可以让您朝着正确的方向前进。您可以根据您的要求修改查询。
在 SQL 服务器中:
create table place
(
place_name varchar(100),
place_pincode varchar(100)
)
insert into place values ('Rio De janerio',1234536987)
select substring(place_pincode,len(place_pincode)-3,len(place_pincode)),
case when isnumeric(place_pincode)=1 then
concat('000000',substring(place_pincode,len(place_pincode)-3,len(place_pincode))) end as place_pincode,
case when isnumeric(place_name)<>1 then
concat('XXXXXX',substring(place_name,len(place_name)-3,len(place_name))) end as place_name
from place