使用SQL'LIKE'语句

时间:2013-04-02 20:27:21

标签: sql-server sql-like

我试图根据输入到文本框中的内容从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'和'姓氏'是史密斯'。我如何更改查询以返回正确的数据?

3 个答案:

答案 0 :(得分: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”这样的变体,您可能需要商品名称匹配产品。

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

答案 1 :(得分:1)

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

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

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

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

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

答案 2 :(得分:0)

连接两列。

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

编辑:如果“John p”未存储为名字,仅存储为“John”,那么您还有其他问题。你可以错误地假设所有的名字都是一个单词并将所有内容子串到第一个空格,但是你会删除像“Mary Ann”这样的名字