我希望你会发现这很有趣! 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的查阅列,我们就可以轻松地将它们与键盘输入相匹配。
当然,我可以制作一本词典,但我想知道是否有更聪明的方法。
谢谢!
答案 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”等)并且可以为您解决这个问题。无论如何,值得考虑。