我有多个具有不同客户名称的表。我试图找出表中同名的次数。这里的挑战是有人可以输入“John Smith”或“Smith,John”这个名字。
每个表中有40,000行,超过40个不同的表。我试图以某种方式查询,而不知道名称,但仍返回相似的名称。
基本上我需要对名称进行分组而不使用如下语句:
WHERE cust_name LIKE '%john%'
当内部数据的格式不同时,如何使用其他表列的内容查询多个表列?您如何最好地“清理”数据以删除逗号,空格等?
答案 0 :(得分:2)
你在SSIS中是否可以使用模糊逻辑。我已成功使用模糊灌浆来查找重复项 - 尽管您希望匹配的名称不仅仅是很多人共享相同的名称。我使用姓名,地址,电话和电子邮件完成了比赛。模糊分组允许您使用多个字段进行匹配。
答案 1 :(得分:1)
这确实不是数据库问题。真正的问题是提出一种算法,它将取名并将其转换为标准格式。这很难做到,实际上取决于源数据的样子。我会查看你的源数据并尝试找出一些模式来查找,然后使用常规字符串操作将它们全部更改为相同的格式。
答案 2 :(得分:0)
名称匹配可能是非常棘手的业务。你不仅需要担心“约翰史密斯”与“史密斯,约翰”的关系,而且你通常需要担心凯瑟琳与凯瑟琳对阵凯特与凯西对阵凯茜。我确信有类似这样的东西的第三方数据挖掘解决方案,虽然没有我可以推荐的。
如果你知道你的名字只有“FirstName LastName”和“LastName,FirstName”的形式,你可以尝试这样的事情:
SELECT
CASE
WHEN name LIKE '%,%'
THEN SUBSTRING(name, CHARINDEX(',', name) + 2, LEN(name)) + ' ' +
SUBSTRING(name, 1, CHARINDEX(',', name) - 1)
ELSE name
END AS name
字符串函数可能取决于您的特定RDBMS。而且,这非常脆弱。它依赖于精确的格式,在列之后有空格等。如果你想要更好的话,你需要调整它。
我还建议您在40个表中添加一个视图作为UNION ALL,以便您可以同时使用它们。可能会在视图中硬编码,以便您知道每行来自哪个表。
最后,您可以考虑使用soundex,但如果您没有使用它,那么实施它可能很困难。