【发布时间】:2014-04-07 05:51:11
【问题描述】:
我想知道是否可以通过函数在 mssql 中对敏感数据进行哈希处理,并为所有字段保留第一个字符“原样”。示例:
“Jon Kirk”的名字应该被提取为 J** K***
【问题讨论】:
标签: sql-server sql-server-2008 tsql sql-server-2008-r2 sql-server-2012
我想知道是否可以通过函数在 mssql 中对敏感数据进行哈希处理,并为所有字段保留第一个字符“原样”。示例:
“Jon Kirk”的名字应该被提取为 J** K***
【问题讨论】:
标签: sql-server sql-server-2008 tsql sql-server-2008-r2 sql-server-2012
我最初发布了一个递归解决方案。这更快:
declare @name varchar(20) = 'Jon Kirk'
declare @loop int = len(@name)
while @loop > 1
select @name = stuff(@name, @loop, 1,
case when substring(@name, @loop-1,2) like '% ' then ' '
when substring(@name, @loop-1,2) like ' %' then substring(@name, @loop,1)
else '*' end), @loop+=-1
select @name
【讨论】:
这样的事情怎么样?
declare @s varchar(50) = 'Jon kirk'
;with cte as (
select 1 as i, cast (' ' + ltrim (@s) as varchar(50)) as s
union all
select i + 1
, cast (
case when substring (s, i, 2) like '% %'
then s
else stuff (s, i + 1, 1, '*') end
as varchar(50))
from cte
where i < len (s)
)
select top 1 ltrim (s) as s
from cte
order by i desc
这是最快的解决方案(虽然它一点也不漂亮):
declare @s varchar(50) = 'Jon kirk'
select left (
left (@s, 1)
+ case when substring (@s, 1, 2) like '% %' then substring (@s, 2, 1) else '*' end
+ case when substring (@s, 2, 2) like '% %' then substring (@s, 3, 1) else '*' end
+ ...
+ case when substring (@s, 48, 2) like '% %' then substring (@s, 49, 1) else '*' end
+ case when substring (@s, 49, 2) like '% %' then substring (@s, 50, 1) else '*' end
, len (@s) )
【讨论】:
如果你的名字被分开并且中间不包含空格,你可以更快地隐藏敏感信息而不会做奇怪的循环:
DECLARE @t as varchar(20) = 'Billy'
SELECT CONCAT( LEFT(@t, 1), REPLICATE('*', LEN(@t) - 1) )
输出B****
【讨论】: