如何对SQL Server表中的列进行最佳匹配?

时间:2018-08-02 12:12:31

标签: sql sql-server

我有一个要求,我要在表的一列中搜索电话号码。电话号码的长度恰好大于表中的长度。

在这种情况下,如何进行最佳匹配以获取与我的电话号码最匹配的列值?

3 个答案:

答案 0 :(得分:1)

您可以使用charindex来搜索列G的值是否存在于您的搜索值中

true

这将找到列电话内容位于“ 012345789”内的任何行

另一种选择是使用全文搜索中的bool HasGreen(int tolerance) { using (var bmp = new Bitmap(Image.FromFile(@"c:\file.bmp"))) { for (int w = 0; w < bmp.Width; w++) for (int h = 0; w < bmp.Height; h++) if (IsGreenPixel(bmp.GetPixel(w, h), tolerance)) return true; } return false; } bool IsGreenPixel(Color color, int tolerance) => color.G > color.R + tolerance && color.G > color.B + tolerance; 功能。
看到这里:https://docs.microsoft.com/en-us/sql/t-sql/queries/contains-transact-sql?view=sql-server-2017

答案 1 :(得分:1)

您可以实现类似Levenshtein distance的功能:

  

两个单词之间的距离是单个字符的最小数量   更改一项所需的编辑(插入,删除或替换)   话到另一个

有许多实现方法,它们在性能方面有所不同,有关此方法,请参见other answersarticle

例如:

SELECT LEVENSHTEIN('0134227897', num) as distance , num
FROM   (VALUES ('0134752267'),
               ('+336709057'),
               ('+3347578974') ) AS t(num) 
order by distance

结果将是:

Distance   num  
5           +3347578974   
5           0134752267   
8           +336709057 

所以最好的匹配是只有5个距离的两个数字

答案 2 :(得分:0)

如果您要查找比其他号码长的电话号码。您可以找到比平均电话号码长的电话号码,如下所示:

SELECT phone_number
FROM my_tbl
WHERE LEN(phone_number) > (SELECT AVG(LEN(phone_number)) FROM my_tbl)

LEN找到VARCHAR字段的长度

AVG是一个汇总函数(一种将列表缩减为单个值的函数),用于计算列表/列的平均值


P.s。我不确定要获得价值的“最佳匹配”是什么意思。