找到“相似”的零件号

时间:2011-01-08 01:23:08

标签: sql-server ascii

我希望你会发现这很有趣! C#是解决方案或T-SQL的首选语言。

考虑以下事项:

项目1:NJ2-12GM50-Wö-V13

项目2:NJ2-12GM50-Wo-V13

您可以猜测进入第1项的个人被复制并粘贴,而进入第2项的个人只使用了'o',这是他能找到的最接近的英文字符。

当有人输入像NJ2-12GM50-Wo-V13这样的新零件号时,我们想向他们建议他们可能意味着NJ2-12GM50-Wö-V13。

为了做到这一点,我们希望将所有可以存储为VARCHAR的字符转换回简单的小写字母。我对将ASCII字符246(ö)转换为ASCII字符111(o)的解决方案感兴趣。

我们的想法是,如果我们创建一个包含所有转换版本的partnumbers的查阅列,我们就可以轻松地将它们与键盘输入相匹配。

当然,我可以制作一本词典,但我想知道是否有更聪明的方法。

谢谢!

3 个答案:

答案 0 :(得分:2)

可能最好的办法是在C#或T-SQL中实现一个函数来计算两个部件号之间的Levenshtein distance

答案 1 :(得分:2)

使用COLLATE子句将字符串强制为大小写和重音不敏感

IF 'NJ2-12GM50-Wö-V13' COLLATE Latin1_General_CI_AI
       =
   'NJ2-12GM50-Wo-V13' COLLATE Latin1_General_CI_AI
      PRINT 'matches'
ELSE
      PRINT 'no match

因此,您可以使用它来验证用户输入

SELECT
   PartNo AS DidYouMeanThis,
   @Input AS WhenYouEnteredThis
FROM
   MyPartNumbers
WHERE
   PartNo COLLATE Latin1_General_CI_AI = @Input COLLATE Latin1_General_CI_AI

使用不同的COLLATE,您可以确保在写入时完全匹配...

IF NOT EXISTS (SLECT * FROM MyPartNumbers
            WHERE PartNo COLLATE Latin1_General_BIN = @Input Latin1_General_BIN)
   RAISERROR ('Oi! I asked DidYouMeanThis', 16, 1)
ELSE
   INSERT ...

答案 2 :(得分:1)

由于某种原因,我无法将其添加为注释,但您可以考虑(或者同样)匹配“常用搜索”映射。这样的系统通常可能是有用的(即“红色衣架 - > AB-999X”等)并且可以为您解决这个问题。无论如何,值得考虑。