我想在SQL Server中编写存储过程来查找最佳匹配记录。给定5个输入参数@A,@B,@C,@D和@E(所有varchar50),对应于我的表中的5列A,B,C,D和E,我想找到记录最匹配的列。在所选记录中不匹配的每列应包含一个空格“'。
举例来说,如果我有输入“索尼”,“的PlayStation”,“控制器”,“黑”,“损坏”,我的表包含以下几列:
"Sony" "Playstation" "Unit" "Black" "Damaged"
"Sony" "Playstation" " " " " " "
它应该返回第二行,因为2个参数匹配,3个不匹配,有空格。我不想返回第一行,因为即使4个参数匹配,中间的不匹配,也不是空格。如果它是一个空间,第一排就是赢家。
我的做法
有一些我不能透露各种细节,但我的基本方法(请注意,我是一个新手SQL)是测试大多数具体到最不具体的每一个组合。所以我的查询会是这个样子:
-- start with most specific
SELECT * FROM dbo.Items WHERE
A = @A
B = @B
C = @C
D = @D
E = @E
-- if no matches, try next
IF @@ROWCOUNT = 0
SELECT * FROM dbo.Items WHERE
A = @A
B = @B
C = SPACE(1)
D = @D
E = @E
... etc.
对我来说,我只需要真正测试16点的配置,因为有些排列永远不会存在。即便如此,这似乎是实现我想要的非常低效的方式。最重要的是,它甚至没有工作。看起来像空间比较是有问题的,因为一些自动修剪正在进行。无论如何,我目前的做法似乎效率低下,并且不起作用 - 所以我转向你寻求帮助。
所以基本上排序最少数量的不正确匹配? – LittleBobbyTables
@LittleBobbyTables,我想返回一个记录,或者根本没有。如果记录被返回,它应该完全匹配除了“”之外的所有内容。 – Dalal
btw,达拉尔,我想你可能有多个比赛,例如,colB中有一个匹配,colC中有一个空格,colB中有空格,colC中有空格。 – Beth