筛选结果在SQL查询中进行搜索

时间:2015-08-29 17:27:20

标签: sql sql-server search join

我正在尝试编写一个SQL查询来过滤产品表中的记录以进行搜索,具体取决于搜索文本。 文本将有多个用空格分隔的单词(例如三星s6)

问题是结果应该包含结果中的所有单词。

现在记录的名称可以是

  1. 三星s6
  2. 三星galaxy s6
  3. 三星A5
  4. 三星galaxy s6 edge
  5. Apple Iphone 6
  6. 现在搜索文本“samsung s6”应该得到记录1,2,4的结果,但我尝试的方式是给我1,2,3,4行结果。

    我的查询是:

    CREATE TABLE #TempSearch
    (
        ID INT IDENTITY(1,1),
        Value VARCHAR(200)
    )
    
    INSERT INTO dbo.#TempSearch
    SELECT * FROM CSVToTable(ISNULL(@ModelName,''),' ')
    
    SELECT 
        T1.*
    FROM
        <table1> T1 INNER JOIN #TempSearch T2 ON T1.Name LIKE CONCAT('%', T2.Value, '%')
    

    我将搜索字符串放在临时表中,该表包含每个单词的行(用空格分隔)

    然后内部加入主表。

1 个答案:

答案 0 :(得分:1)

我认为你想要一个聚合和左外连接:

SELECT T1.Name
FROM <table1> T1 JOIN
     #TempSearch ts
     ON T1.Name LIKE CONCAT('%', Ts.Value, '%')
GROUP BY t1.Name
HAVING COUNT(*) = (SELECT COUNT(*) FROM #TempSearch);

这会计算匹配数并确保所有组件都匹配。 您可以向SELECTGROUP BY添加更多列,以获取更多列。

注意:

以下更简单的版本适用于您的示例:

select t1.*
from t1
where t1.name like '%' + replace(@ModelName, ' ', '%') + '%';