2017-04-18 68 views
2

想執行根據如下面的映射通過使用MSSQL 2008R2數據掩蔽:MSSQL - 基於映射表掩蔽數據


映射表

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

附:價值編輯,因爲反向或反向替換不能在這種情況下使用

任何想法?

+0

是,不要使用替代,採用分體式,加入和組CONCAT(XML的路徑和東西)。 –

+2

您需要更改替換的順序。從裏到外,做3-2-1-C-B-A。 –

+0

@sphenix更改您的替換訂單。您目前的訂單不是傳遞 –

回答

3

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

下面有兩個代碼段,它們將掩碼或UnMask一個字符串。容易轉換成一個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,'') 
+0

我懶得寫滿回答:-) –

+0

@ZoharPeled複製並粘貼我的朋友...複製並粘貼:) –

+0

哇,我傾向於問,你怎麼能腦子這麼快用這個解決方案.......它工作的人... ..謝謝感謝.... – sphenix

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

+0

它可能在這種情況下工作,但映射表實際上可以由用戶維護,反向可能不是好主意。 – sphenix

+0

這可能工作太.....但如果值不落入映射表,它將成爲9.但嘿,我從你們學到了一些東西,謝謝@shiju – sphenix