我在Coursera上上了杜克的MySQL课程。在第二周,有关于混乱数据的引用,我想我应该在这里提出我的问题。我的问题的范围是如何比较表行中已经与实例匹配的条目,除非它是用连字符输入的,即“金毛猎犬混合”与“金毛猎犬混合”是相同的实例。当我运行不同的SELECT语句时,我不希望它同时提取两个结果。问题是,我们不能只是删除列字段中的所有连字符,因为我们仍然需要它们作为"Golden -Airedale Terrier Mix“的条目。查询是如何做到这一点的。下面是同时引入“金毛猎犬混合”和“金毛猎犬-混合”的示例代码。
SELECT DISTINCT breed,
TRIM(LEADING '-' FROM breed)
FROM dogs
ORDER BY (LEADING '-' FROM breed) LIMIT 1000, 1000;我在想,我需要一个IF/THEN语句,上面写着IF(REPLACE(breed,'-','') = breed) THEN DELETE breed;
很明显,这不是正确的语法,这正是我要找的。
发布于 2017-05-10 15:47:41
现在已经差不多了,您需要做的就是去掉select子句中的普通breed列,并用REPLACE()更改TRIM()
SELECT DISTINCT REPLACE(breed, '-', ' ')
FROM dogsTRIM(LEADING...)将删除字符串开头的连字符,但您希望显示的是将连字符视为空格的breed的不同值。
编辑
我假设这两个字符串是“金毛猎犬混合”和“金毛猎犬-混合”,但是如果连字符后面实际上有一个空格(“金毛猎犬-混合”),你可以用REPLACE(breed, '-', '')代替。
编辑2
在您的评论中澄清之后,我认为您需要的是一个GROUP BY子句
SELECT MIN(breed)
FROM dogs
GROUP BY REPLACE(breed, '-', ' ')任何带有下划线的字符串都将被认为比带有空格的相同字符串的值更高,因此当两者都存在时,此查询将返回带有空格的字符串。如果只有一个,它将按原样返回
发布于 2017-05-10 15:55:54
我认为您正在寻找的是Levenshtein距离(https://en.wikipedia.org/wiki/Levenshtein_distance)。这个计算词之间的差异,例如,"Test“和"Test1”的比较结果为1,因为多了一个字母。您可以使用How to add levenshtein function in mysql?或Levenshtein: MySQL + PHP中建议的过程
这不仅会显示所有前导为"-“的条目,甚至还会显示拼写错误的条目。然后,您可以根据计算出的距离过滤结果数据。
如果您因为性能问题而不想要这个字符串,您仍然可以使用TRIM或REPLACE来过滤您的符号,并将其与其他字符串进行比较。
https://stackoverflow.com/questions/43886365
复制相似问题