0

我正在尝试根据在文本框中输入的内容从 SQL 数据库中提取一些数据。所有这些都有效,但是我在构建我想要的查询时遇到了一些麻烦。

我的查询是这样的:

select emp.firstname, emp.lastname, emp.EmployeeNo, jc.Department

from EmployeeMaster emp

    inner join JobClass jc on emp.jobclass = jc.JobClass

where emp.firstname LIKE 'Joe P Smith' AND emp.lastname LIKE 'Joe P Smith'

来自网页的输入将采用“Joe P Smith”的格式,这是我无法控制的。在数据库中,“名字”存储为“Joe P”,“姓氏”存储为“Smith”。我需要如何更改查询以返回正确的数据?

4

3 回答 3

1

你可以试试

MS SQL Server:
... where rtrim(emp.firstname) + ' ' + rtrim(emp.lastname) = string_being_passed

DB2, Oracle: 
... where trim(emp.firstname) || ' ' || trim(emp.lastname) = string_being_passed

但是名字很难(“不平凡”)。要处理像“John P. Smith”这样的变体,您可能需要一个商业名称匹配产品。

注意:根据数据、列的类型以及数据库处理尾随空格的方式,您可能不需要trimor rtrim(如有疑问,请将它们留在那里)。真正的等价物trim(str)ltrim(rtrim(str))rtrim可能就足够了,除非您需要担心数据库数据中的前导空格。

于 2013-04-02T20:32:21.020 回答
1

以下不是 100% 完美的解决方案,而是在大多数情况下都有效的折衷方案,也许您可​​以接受:

如果您不介意同时查找Joe Smith Joe P Smith,则可以忽略中间的字母/名称:
使用空格分隔用户输入,但仅使用第一个和最后一个单词,而忽略中间的那些。

无论用户输入Joe Smith,Joe P Smith还是Joe Jack John Smith,您只需使用JoeandSmith并生成以下 SQL:

where emp.firstname LIKE 'Joe%' AND emp.lastname LIKE '%Smith'

需要注意的是,当Joe SmithJoe P Smith all Joe Jack John Smith实际存在于数据库中时,查询将返回所有三个。

于 2013-04-02T20:47:04.630 回答
0

连接两列。

Where firstname+' '+lastname like 'John smith'

编辑:如果“John p”没有存储为名字,只有“John”,那么你还有其他问题。您可能会错误地假设所有名称都是一个单词并将所有内容子串到第一个空格,但随后您消除了诸如“Mary Ann”之类的名称

于 2013-04-02T20:33:37.273 回答