Sql server 一个搜索引擎中多个名称的Sql查询

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

有人能帮我找出下面场景的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%'
    )

我想把琼斯也包括在搜索框中,那么情况会怎样变化呢。在您的
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谓词,因为它不是全文索引的。所以我必须在客户端拆分中进行操作?不,必须设置全文索引。阅读我在文章中发布的关于如何设置它的内容。