Sql server 一个搜索引擎中多个名称的Sql查询
有人能帮我找出下面场景的SQL查询吗。 我有一个搜索框,我想搜索由空格分隔的多个名称 例如:“David Jones”,它给出了David和Jones详细信息的结果Sql server 一个搜索引擎中多个名称的Sql查询,sql-server,Sql Server,有人能帮我找出下面场景的SQL查询吗。 我有一个搜索框,我想搜索由空格分隔的多个名称 例如:“David Jones”,它给出了David和Jones详细信息的结果 select emp.cid as empcid, emp.name, emp.employeeno, info.employeeUniqueId, info.agentId, info.empBankCode, info.accountNumber, info.i
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%'
)
我想把琼斯也包括在搜索框中,那么情况会怎样变化呢。在您的
tblemEmployee
、fk\u tblUserEmployeeList
和empinfo
表上设置全文索引后,您的查询将如下所示:
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]%'
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 |
+--------+-------+------------+------------------+---------+-------------+---------------+-----------+
请注意,我将您的查询更改为使用现代行业标准联接样式
请记住,要在表上创建全文索引,该表必须具有单列唯一索引。如果其中一个表具有多列主键,则必须添加一列(有关详细信息,请参阅)
关于命名约定的几点注意事项:
- 没有必要在表名前面加上
(尤其是因为这样做并不一致)。有很多人告诉你不要这样做:举个例子tbl
是一个错误的表名:前缀fk\u tbluseEmployeeList
和fk
不添加任何信息。此表中存储了什么类型的信息?我建议使用更具描述性的名称(不带前缀)tbl
现在,如果不想使用全文索引,可以在发送到SQL Server之前解析输入客户端。您可以在一个空格上拆分搜索输入,然后相应地构造SQL。可能重复的只是不使用接受的答案,答案中有更好的数据集方法。如何在使用“like”操作时应用多个输入字符进行查询?注意,此搜索可能有两个或多个名称正如我上面所说的,您确实希望使用全文搜索,而不是像那样使用
。也就是说,如果您真的想像
一样使用,我认为最好的选择是在客户端执行(在空格上拆分查询字符串,并动态构建SQL)。显示此错误时,无法对表或索引视图“tblemployee”使用CONTAINS或FREETEXT谓词,因为它不是全文索引的。所以我必须在客户端拆分中进行操作?不,必须设置全文索引。阅读我在文章中发布的关于如何设置它的内容。