【问题标题】:MSSQL - Masking data based on mapping tableMSSQL - 基于映射表屏蔽数据
【发布时间】:2017-09-14 05:03:47
【问题描述】:

想使用MSSQL 2008R2根据如下映射执行数据屏蔽:


映射表

A = C
B = A
C = E
1 = 3
2 = 1
3 = 9

原创

ABC123

蒙面

CAE319

这个想法是使用替换,但是第二个替换函数将替换以前的替换值。

select Replace(Replace(Replace(Replace(Replace(REPLACE('ABC123', 'A', 'C'), 'B', 'A'), 'C', 'E'), '1', '3'), '2', '1'), '3', '9')

结果:CAE319

附:值已编辑,因为在这种情况下无法使用反向或反向替换

有什么想法吗?

【问题讨论】:

  • 是的,不要使用replace,使用split、join和group concat(用于xml路径和东西)。
  • 您需要更改替换的顺序。从内到外,做 3-2-1-C-B-A。
  • @sphenix 更改您的替换顺序。您当前的订单不可传递

标签: sql sql-server tsql replace masking


【解决方案1】:

只需改变替换的顺序并反转结果

select REVERSE( Replace(Replace(Replace(Replace(Replace(REPLACE('321CBA', '3', '9'), '2', '3'), '1', '2'), 'C', 'E'), 'B', 'D'), 'A', 'C'))

结果:

CDE239

编辑:

Declare @Mask table (MapFrom varchar(10),MapTo varchar(10))
Insert into @Mask values 
('A','C'),
('B','A'),
('C','E'),
('1','3'),
('2','1'),
('3','9')

DECLARE @pos INT
    ,@result VARCHAR(100)
    ,@maskfrom NCHAR(1)
    ,@mask_to NCHAR(1);

SET @result = 'ABC123';
SET @pos = 1

WHILE @pos < LEN(@result) + 1
BEGIN
    SELECT @mask_to = MapTo
    FROM @mask
    WHERE MapFrom = substring(@result, @pos, 1)

    SET @result = STUFF(@result, @pos, 1, @mask_to);
    SET @pos = @pos + 1;
END

SELECT @result

结果

CAE319

【讨论】:

  • 这种情况下也可以,但是映射表其实可以由用户自己维护,反向可能不太好。
  • 这可能也行......但是如果值不属于映射表,它将变为9。但是,嘿,我从你们那里学到了一些东西,谢谢@shiju跨度>
【解决方案2】:

如果您想要更多表格的方法。

下面有两个代码段将屏蔽或取消屏蔽字符串。轻松转换成 UDF 甚至放在 CROSS APPLY 中

Declare @Mask table (MapFrom varchar(10),MapTo varchar(10))
Insert into @Mask values 
('A','C'),
('B','D'),
('C','E'),
('1','2'),
('2','3'),
('3','9')


Declare @Yourtable table (ID int,SomeCol varchar(max))
Insert Into @Yourtable values
(1,'ABC123')

-- To Mask
Declare @U varchar(max) ='ABC123'

Select NewSting = Stuff((Select ''+S 
    From (
        Select N
                ,S=IsNull(MapTo,Substring(@U,N,1))
            From (Select Top (Len(@U)) N=Row_Number() Over (Order By (Select null)) From master..spt_values)  N
            Left Join @Mask on Substring(@U,N,1)=MapFrom
        ) X 
    Order By N
    For XML Path ('')),1,0,'') 

-- To UnMask
Declare @M varchar(max) = 'CDE239'

Select NewSting = Stuff((Select ''+S 
    From (
        Select N
                ,S=IsNull(MapFrom,Substring(@M,N,1))
            From (Select Top (Len(@M)) N=Row_Number() Over (Order By (Select null)) From master..spt_values)  N
            Left Join @Mask on Substring(@M,N,1)=MapTo
        ) X 
    Order By N
    For XML Path ('')),1,0,'') 

【讨论】:

  • 我懒得写一个完整的答案:-)
  • @ZoharPeled 复制并粘贴我的朋友...复制并粘贴 :)
  • 哇,我想问你怎么能用这个解决方案这么快地动脑筋......它很有效......谢谢谢谢......
  • @sphenix 很高兴它有帮助
  • 只是想知道是否可以避免使用“master..spt_values”?因为恐怕没有权限使用它
猜你喜欢
  • 1970-01-01
  • 2011-11-06
  • 2015-03-28
  • 1970-01-01
  • 2021-04-10
  • 1970-01-01
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
相关资源
最近更新 更多