我试图根据输入到文本框中的内容从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'和'姓氏'是史密斯'。我如何更改查询以返回正确的数据?
答案 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”这样的变体,您可能需要商品名称匹配产品。
注意:根据数据,列的类型以及数据库处理尾随空格的方式,您可能不需要trim
或rtrim
(有疑问,请将它们保留在那里)。 trim(str)
的真实等效值为ltrim(rtrim(str))
,但rtrim
可能就足够了,除非您需要担心数据库数据中的前导空格。
答案 1 :(得分:1)
以下不是100%完美的解决方案,而是在大多数情况下都有效的妥协方案,也许您可以接受这一点:
如果您不介意同时查找Joe Smith
和 Joe P Smith
,则可以忽略中间字母/名称:
使用空格分割用户输入,但只使用第一个和最后一个单词,忽略中间的单词。
无论用户是输入Joe Smith
,Joe P Smith
还是Joe Jack John Smith
,您只需使用Joe
和Smith
并生成以下SQL:
where emp.firstname LIKE 'Joe%' AND emp.lastname LIKE '%Smith'
需要注意的是,当Joe Smith
,Joe P Smith
和 Joe Jack John Smith
实际存在于数据库中时,查询将全部返回。
答案 2 :(得分:0)
连接两列。
Where firstname+' '+lastname like 'John smith'
编辑:如果“John p”未存储为名字,仅存储为“John”,那么您还有其他问题。你可以错误地假设所有的名字都是一个单词并将所有内容子串到第一个空格,但是你会删除像“Mary Ann”这样的名字