SQL - 按任意顺序搜索确切的单词匹配

时间:2017-02-07 23:06:37

标签: sql search

我花了一整天的时间寻找答案,并且已经解决了这样一个事实,即在3种不同的搜索引擎变体之后它是不可能的。这是我的问题。我需要搜索打印机型号表。由于打印机型号没有标准化,因此模型的不同部分可能处于不同的顺序。

HP OfficeJet Pro 8715

HP OfficeJet 8715 Pro

两者显然是相同的打印机,但它们在我们和供应商之间的共享数据库中以两种方式出现。问题是,如果我搜索 HP OfficeJet Pro 8715 ,它应该返回 HP OfficeJet 8715 Pro ,但它不应该返回 HP OfficeJet Pro 8715dw 例如。

总之,单词可以是任何顺序,但单词必须完全匹配。

我已经将搜索字符串解析为#temp表,以便每行都有一个单词,这就是我比较查找结果的方式。

INSERT INTO #results 
    SELECT Make, Model 
    FROM tDevices 
        WHERE ( Make LIKE '%' + @MAKE + '%' ) AND ( Model LIKE '%' + @MODEL + '%' ) AND ( Model LIKE '%' + @MODEL2 + '%' )

每个模型变量是模型中的另一个单词。这很好但返回 HP OfficeJet Pro 8715 以及 HP OfficeJet Pro 8715dw

这可能吗?

由于

1 个答案:

答案 0 :(得分:0)

返回 8715dw ,因为%(任何运算符)允许它。

尝试不使用%s:

INSERT INTO #results 
    SELECT Make, Model 
    FROM tDevices 
        WHERE ( Make LIKE @MAKE ) AND ( Model LIKE @MODEL ) AND ( Model LIKE  @MODEL2 )

更新(基于https://stackoverflow.com/a/14291100/510788):

SELECT * FROM
  (SELECT Make, CONCAT(' ', REPLACE(Model,' ','  '), ' ') AS Model FROM tDevices) t
WHERE
   Make  LIKE '%hp%' AND (
       Model LIKE '% 8715 %' OR
       Model LIKE '% pro %' AND
       (REPLACE(REPLACE(Model,
       ' 8715 ',''),
       ' pro ','')) = ''
   )