在SQL中编辑字符串

时间:2014-01-01 18:06:22

标签: sql sql-server

目前我的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部分。

有人有任何建议吗?

3 个答案:

答案 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);

enter image description here

使用冒险作品信用卡表进行示例通话。

use AdventureWorks2012;
go

select top 5 * from [Sales].[CreditCard] cross apply MaskNumbers(CardNumber);
go

enter image description here

如果您只想更改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

enter image description here

答案 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