在MySQL中,我有一个表,它接受来自多个输入通道的公共数据,包含~100,000行。
其中一个字段,存储员工职能经理的姓名。在组织中,有大约100名这些职能经理。
我遇到的问题是,由于有多个输入渠道,不同的报告系统为这些经理使用了不同的名称格式。
例如,John Smith可以存储为;
John Smith
Smith, John
Smith John
现在这是一个噩梦,因为我们希望将此功能管理器字段用作报告机制,这意味着我们需要对各个职能经理进行排序或分组。
每个季度之后数据都会成为遗产,因此我们很乐意清理和格式化功能管理器字段。
问题是,是否有一种简单的方法可以对这些管理器进行分组,即使它们的名称格式不同,我也在寻找一种不会让我逐个通过每个功能管理器的方式这样:
UPDATE tablename SET fm_name = "John Smith" where fm_name like "%John%" and fm_name like "Smith";
例如;以编程方式,我可以获取第一条记录,将名称分解为其名字和姓氏字符串,然后匹配类似的记录并更新它们。然后转到下一条记录。在MySQL中是这样的,或者我会在上面的层中做得更好。
任何建议都将不胜感激。
答案 0 :(得分:2)
如果你能提出一个标准化函数name_normalize(string)
,在给出确切输入或George H. W. Bush
的情况下产生Bush, George H. W.
,那么你可以做
GROUP BY name_normalize(name)
并获得您想要的内容,而不会遗漏表格中的数据。
这是一个功能。它破解了MySQL的字符串函数。 https://dev.mysql.com/doc/refman/5.7/en/string-functions.html
IF(LOCATE(',',@name1) = 0, --need to change?
@name1, -- no, return original
LEFT(CONCAT_WS(' ', -- yes, concatenate...
TRIM(SUBSTRING_INDEX(@name1, ',',-1)), -- after last ,
@name1), -- whole name
LENGTH( -- cut to original name length
REPLACE(@name1,',','')))) -- but without the comma
替换@name
列的名称。请注意,这对逗号后面的空格数很敏感。
将此功能定义为存储功能是明智的。首先,你可以更好地处理奇怪的情况。另一方面,在查询中编写它有点长。