从一个参数对三个字段进行SQL搜索

本文关键字:字段 SQL 三个 搜索 一个 参数 | 更新日期: 2023-09-27 18:11:45

我有一个SQL Server Person Table:

  • PersonId
  • FirstName
  • SecondName
  • LastName

在我的应用程序中,我有一个TextField,其中用户可以输入Person全名。在ValueChange事件我的TextField在一个后台线程,我调用我的Stored Procedure,以获得搜索结果。

ALTER PROCEDURE [dbo].[sp_person_search]
@fullname nvarchar(100)
AS
BEGIN
SELECT
PersonId,
FirstName,
SecondName,
LastName
FROM Person
WHERE ....
// here I have to figure out how to search a person based on just one field
END

什么线索吗?

从一个参数对三个字段进行SQL搜索

解析用户输入的数据是您可能遇到的最糟糕的情况之一。快,编写代码,将捕获'John Sm ith'的问题!

最好的选择是为名称的每个部分都设置输入字段,这与表单或表中的数据相匹配。通常情况下,我强烈建议不要为了让代码变得更简单而把负担放在用户身上。但在这种情况下,输入First Name, Middle (Name或Initial), Last Name是几乎所有UI的事实上的标准。当您浏览Internet并在这个站点或那个站点输入您的姓名时,其中有多少站点只有一个完整名称的文本字段?我想不起来,虽然我一直没有留意。

即使这样做,搜索名字也是很麻烦的。我发现一种有益的方法是为Last_Name添加一个类似Last_Name_Searchable的重复字段。它包含Last_Name的内容,但删除了所有非字母字符,其余全部转换为大写或小写。所以Van der Snord-Griggel变成了VANDERSNORDGRIGGEL。然后,即使懒惰的用户输入van der snordgriggle或任何其他变体(只要拼写正确),我们也可以找到名称。

变量是将一个单独表中的变量列表规范化。在上面的例子中,可以有VANDERSNORDGRIGGELDERSNORDGRIGGELVANSNORDGRIGGELSNORDGRIGGELVANDERSNORD等条目。我从来没有真正实现过这种技术,因为它需要大量的努力来保持它的有用性。但对于批处理系统,你不能只是闪现一个Name not found错误,让用户再试一次,它可能是有用的。

不是很优雅,可能也不是很有效。让我们看看有没有人有更好的主意。

假设你的@fullname等于"Mary Jo May"

SELECT
   PersonId,
   FirstName,
   SecondName,
   LastName
FROM Person
WHERE FirstName + ' ' + SecondName + ' ' + LastName = @fullname

还存在缺少SecondName可能性的问题。在这种情况下,字段的连接可能是错误的因为没有SecondName

就连接了两个空格