目前我的SQL表中有一个列可以保存付款信息。例如,列可能具有“VISA-2435 exp:12/13 Auth#32423”。我想编辑VISA-2435而不是VISA-XXXX。每一行都是不同的,所以我不能做一个简单的搜索和替换该静态字符串。
我尝试了以下查询,但我没有考虑字符串可能有何不同
UPDATE messages
SET message = REPLACE(message, LIKE'%Visa-2334%', 'VISA-xxxx')
WHERE message LIKE '%Visa'
另外,我可以改变主意,只需编辑字符串的exp:12/13部分。
有人有任何建议吗?
答案 0 :(得分:1)
使用表值功能(TVF)或CLR功能。我认为TVF可能会更快,但你必须进行测试。
这是TVF的快速实现。它掩盖了所有数字。从隐私的角度来看,这是最好的!
--
-- Create a table value function
--
CREATE FUNCTION MaskNumbers (@input_txt varchar(128))
RETURNS TABLE
AS
RETURN
(
SElECT
replace(
replace(
replace(
replace(
replace(
replace(
replace(
replace(
replace(
replace(@input_txt, '0', 'X')
, '1', 'X')
, '2', 'X')
, '3', 'X')
, '4', 'X')
, '5', 'X')
, '6', 'X')
, '7', 'X')
, '8', 'X')
, '9', 'X')
as masked_txt
);
使用您的数据进行示例调用。
declare @sample varchar(128) = 'VISA-2435 exp:12/13 Auth#32423'
select * from MaskNumbers(@sample);
使用冒险作品信用卡表进行示例通话。
use AdventureWorks2012;
go
select top 5 * from [Sales].[CreditCard] cross apply MaskNumbers(CardNumber);
go
如果您只想更改VISA后的4位数,请使用CHARINDEX()和STUFF();
-- Raw data
declare @sample varchar(128) =
'Random Stuff Before vIsA-2435 ExP:12/13 AuTh#32423 Random Words After';
-- Masked data
select
@sample as old_sample,
case
when charindex('visa-', @sample) > 0 then
stuff(@sample, charindex('visa-', @sample) + 5, 4, 'XXXX')
else @sample
end as new_sample
go
答案 1 :(得分:0)
此代码可能是一个解决方案:
UPDATE messages
SET message = STUFF(@S,CHARINDEX('-',messages),(PATINDEX('% exp%',messages)-CHARINDEX('-',messages)),'XXXX')
WHERE message LIKE '%Visa'
答案 2 :(得分:0)
您可以使用 Stuff() 功能完成这项工作:
样本表和数据:
Create table table1 (val varchar(50))
Insert into table1 (val) values ('VISA-2435 exp:12/13 Auth#32423')
查询1:
--To replace 4 numbers after VISA-
Select stuff(val, 6, 4, 'XXXX') col1
From Table1;
查询2:
--To replace numbers after VISA- and exp:
Select stuff(stuff(val, 6, 4, 'XXXX'), 15,5,'YY/MM') col1
From Table1
<强> Fiddle demo 强>