任何人都可以帮助我找出以下情况的SQL查询。 我有一个搜索框,我想搜索多个用空格分隔的名称。
例如:“ David Jones ”,它提供了David的详细信息和Jones的详细信息。
select
emp.cid as empcid,
emp.name,
emp.employeeno,
info.employeeUniqueId,
info.agentId,
info.empBankCode,
info.accountNumber,
info.ibanAccNo
from tblemployee emp,
fk_tblUserEmployeeList f,
empinfo info
where
info.employee = emp.cid
and emp.cid = f.employeeid
and f.userId = 1
and
(
name like '%david%'
or emp.employeeno like '%david%'
or info.employeeUniqueId like '%david%'
or info.agentId like '%david%'
or info.empBankCode like '%david%'
or info.accountNumber like '%david%'
)
我还要在搜索框中添加Jones,然后 like 条件会如何变化>
答案 0 :(得分:1)
这似乎是full-text search的情况。在tblemployee
,fk_tblUserEmployeeList
和empinfo
表上设置全文索引之后,查询将类似于以下内容:
SELECT
emp.cid AS empcid,
emp.name,
emp.employeeno,
info.employeeUniqueID,
info.agentID,
info.empBankCode,
info.accountNumber,
info.ibanAccNo
FROM dbo.tblemployee emp
INNER JOIN dbo.fk_tblUserEmployeeList f ON
f.employeeid = emp.cid
INNER JOIN dbo.empinfo info ON
info.employee = emp.cid
WHERE
f.userID = 1
AND
( FREETEXT(Emp.*, 'david jones')
OR FREETEXT(info.*, 'david jones')
)
为您提供此数据:
+--------+-------+------------+------------------+---------+-------------+---------------+-----------+
| empcid | name | employeeno | employeeUniqueID | agentID | empBankCode | accountNumber | ibanAccNo |
+--------+-------+------------+------------------+---------+-------------+---------------+-----------+
| 1 | David | NULL | david | david | david | david | david |
| 2 | Jones | NULL | jones | jones | jones | jones | jones |
+--------+-------+------------+------------------+---------+-------------+---------------+-----------+
请注意,我将您的查询更改为使用现代行业标准的联接样式。
请记住,要在表上创建全文索引,表必须具有单列唯一索引。如果您的一个表具有多列主键,则必须添加一列(有关更多信息,请参见this question)。
关于命名约定的一些注意事项:
tbl
(尤其是因为您这样做的不一致)。有很多人告诉您不要这样做:以this answer为例。fk_tblUserEmployeeList
是错误的表名:前缀fk
和tbl
不会添加任何信息。该表中存储哪些信息?我建议使用更具描述性的名称(不带前缀)。现在,如果您不想走全文索引的路线,则可以在发送到SQL Server之前解析输入客户端。您可以在空间上分割搜索输入,然后相应地构造SQL。
答案 1 :(得分:0)
declare @SearchString varchar(200)='David Jones', @Word varchar(100)
declare @Words table (Word varchar(100))
-- Parse the SearchString to extract all words
while len(@SearchString) > 0 begin
if charindex(' ', @SearchString)>0 begin
select @Word = rtrim(ltrim(substring(@SearchString,0,charindex(' ', @SearchString)))),
@SearchString = rtrim(ltrim(replace(@SearchString, @Word, '')))
end
else begin
select @Word = @SearchString,
@SearchString = ''
end
if @Word != ''
insert into @Words select @Word
end
-- Return Results
select t.*
from MyTable t
join @Words w on
' ' + t.MyColumn + ' ' like '%[^a-z]' + w.Word + '[^a-z]%'