【问题标题】:Filter results in SQL query for search在 SQL 查询中过滤结果以进行搜索
【发布时间】:2015-11-24 03:58:12
【问题描述】:

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

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

现在记录可以有类似的名字

  1. 三星s6
  2. 三星 Galaxy s6
  3. 三星A5
  4. 三星 Galaxy s6 edge
  5. 苹果 iPhone 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, '%')

我在一个临时表中获取了搜索字符串,其中每个单词都有一行(以空格分隔)

然后inner加入主表。

【问题讨论】:

  • 请提供想要的结果。
  • @PM77-1 我在问题“对于搜索文本'samsung s6'我应该得到记录 1,2,4 但我尝试的方式是给我 1,问题中记录的结果中有 2,3,4 行。”

标签: sql sql-server search join


【解决方案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, ' ', '%') + '%';

【讨论】:

  • 让它与您的解决方案一起使用我第一次尝试时在搜索参数中有一些拼写错误.. 将您的 ans 标记为解决方案.. :D
猜你喜欢
  • 2012-07-05
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 2014-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多