【发布时间】:2018-02-19 16:12:58
【问题描述】:
我们处理大量敏感数据,我想仅使用每个姓名部分的首字母和最后一个字母来屏蔽乘客姓名,并用三个星号 (***) 连接,
例如:名称“John Doe”将变为“J***n D***e”
对于由两部分组成的名称,这可以通过使用表达式查找空格来实现:
LEFT(CardHolderNameFromPurchase, 1) +
'***' +
CASE WHEN CHARINDEX(' ', PassengerName) = 0
THEN RIGHT(PassengerName, 1)
ELSE SUBSTRING(PassengerName, CHARINDEX(' ', PassengerName) -1, 1) +
' ' +
SUBSTRING(PassengerName, CHARINDEX(' ', PassengerName) +1, 1) +
'***' +
RIGHT(PassengerName, 1)
END
但是,乘客姓名可以有两个以上的部分,并没有真正的限制。我应该如何找到表达式中所有空格的索引?或者我应该以不同的方式解决这个问题?
非常感谢任何帮助或指针!
【问题讨论】:
-
如果您将整个名称存储在一个列中,那么您正在打一场不可能的战斗。你怎么知道名字的结尾和姓氏的开始?到目前为止,最好的方法是使用两列而不是一列来保存他们的名字。您对单个列所做的任何事情都是脆弱的,并且不会总是有效。
-
解析名称可能是数据库中最古老的问题。没有包罗万象的解决方案,因为每个解决方案都 100% 依赖于您的数据。
-
如果某人的名字是
'Edgar Allan Poe',你会期待什么?你想输出为'E***r A***n P***e'吗?什么版本的 SQL Server?此外,如果您打算这样做来尝试掩盖人们的姓名,那么有一些非常聪明的应用程序可能会计算出姓名的实际含义(尤其是使用如此简单的算法)。 -
第一个猜测:选择一个返回结果表的字符串拆分器,应用一个函数来标准化空白(制表符,... -> 单个空白),在空白处拆分, 对X the paragrab 应用函数, 重新组装, 满足地叹息。 (闻起来很糟糕。)
标签: sql-server string tsql