SQL搜索一个参数的三个字段

时间:2014-07-06 22:22:30

标签: c# sql sql-server

我有一个SQL Server人员表:

  • PERSONID
  • SecondName
  • 名字

在我的应用程序中,我有一个TextField,用户可以输入人名全名。在后台线程上的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

有任何线索吗?

2 个答案:

答案 0 :(得分:1)

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

您最好的选择是为名称的每个部分提供输入字段,该字段与表格中的表格或数据相匹配。通常情况下,我强烈建议不要为用户增加负担,以使代码更容易。但在这种情况下,输入名字,中间(姓名或初始),姓氏几乎是所有用户界面的事实上的标准。当您在互联网上旅行并在此站点或该站点输入您的姓名时,其中有多少人有一个完整名称的单个文本字段?我无法想到,尽管我还没有跟踪。

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

一种变体是规范化单独表格中的变体列表。在上面的示例中,可能会有VANDERSNORDGRIGGELDERSNORDGRIGGELVANSNORDGRIGGELSNORDGRIGGELVANDERSNORD等条目。我从未真正实现过这种技术,因为它需要付出很多努力才能保持其有用性。但是对于批量系统,您只能闪现Name not found错误并让用户再试一次,这可能很有用。

答案 1 :(得分:0)

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

假设您的@fullname等于“Mary Jo May”

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

还存在缺少SecondName可能性的问题。在这种情况下,字段的串联可能是错误的,因为你得到两个没有SecondName连接的空格