SQL在单个搜索引擎中查询多个名称

时间:2018-10-08 10:23:50

标签: 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.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 条件会如何变化>

2 个答案:

答案 0 :(得分:1)

这似乎是full-text search的情况。在tblemployeefk_tblUserEmployeeListempinfo表上设置全文索引之后,查询将类似于以下内容:

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是错误的表名:前缀fktbl不会添加任何信息。该表中存储哪些信息?我建议使用更具描述性的名称(不带前缀)。

现在,如果您不想走全文索引的路线,则可以在发送到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]%'