查找和替换信用卡号

iar*_*arp 5 sql sql-server replace credit-card

我们有一个包含大量数据的大型数据库。我发现最近我们的销售和运输部门一直在使用该应用程序的一部分来公开存储客户的信用卡号。我们已经停止了它,但是现在有成千上万的数字行。

我们正在尝试找出如何连续扫描某些列中的16位数字(或破折号)并将其替换为X。

这不是一个简单的UPDATE语句,因为卡号存储在大量文本中。到目前为止,我一直无法弄清楚SQL Server是否能够进行正则表达式(似乎没有)。

所有其他的失败,我将通过PHP来完成,因为那是我最擅长的...但是那会很痛苦。

Sea*_*ean 5

听起来您需要将 PATINDEX 与 WHERE LIKE 子句一起使用。

像这样的东西。用类似的东西创建一个存储过程,然后用你已经确定的一堆不同的参数(使@pattern & @patternlength 作为参数)调用它,直到你替换了所有的实例。

declare @pattern varchar(100), @patternlength int
set @pattern = '[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]'
set @patternlength = 19

update  tableName
set fieldName = 
    LEFT(fieldName, patindex('%'+ @pattern + '%', fieldName)-1) 
    + 'XXXX-XXXX-XXXX-XXXX' 
    + SUBSTRING(fieldName, PATINDEX('%'+ @pattern + '%', fieldName)+@patternlength, LEN(fieldName))
from tableName
where fieldName like '%'+ @pattern + '%'
Run Code Online (Sandbox Code Playgroud)

诀窍是找到合适的模式,并设置合适的@patternlength 值(不是@pattern 的长度,因为那是行不通的!)


Ste*_*rea 4

我认为你最好以编程方式执行此操作,特别是因为你提到数据可以采用几种不同的格式。请记住,并非所有信用卡号码都是 16 位数字(Amex 为 15,Visa 为 13 或 16 等)。

如果可能的话,检查各种正则表达式和验证代码的能力可能最好在清理作业级别提供。