从一个参数对三个字段进行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
什么线索吗?
解析用户输入的数据是您可能遇到的最糟糕的情况之一。快,编写代码,将捕获'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
或任何其他变体(只要拼写正确),我们也可以找到名称。
变量是将一个单独表中的变量列表规范化。在上面的例子中,可以有VANDERSNORDGRIGGEL
、DERSNORDGRIGGEL
、VANSNORDGRIGGEL
、SNORDGRIGGEL
、VANDERSNORD
等条目。我从来没有真正实现过这种技术,因为它需要大量的努力来保持它的有用性。但对于批处理系统,你不能只是闪现一个Name not found
错误,让用户再试一次,它可能是有用的。
不是很优雅,可能也不是很有效。让我们看看有没有人有更好的主意。
假设你的@fullname等于"Mary Jo May"
SELECT
PersonId,
FirstName,
SecondName,
LastName
FROM Person
WHERE FirstName + ' ' + SecondName + ' ' + LastName = @fullname
还存在缺少SecondName可能性的问题。在这种情况下,字段的连接可能是错误的因为没有SecondName