我正在尝试编写一个SQL查询来过滤产品表中的记录以进行搜索,具体取决于搜索文本。 文本将有多个用空格分隔的单词(例如三星s6)
问题是结果应该包含结果中的所有单词。
现在记录的名称可以是
现在搜索文本“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, '%')
我将搜索字符串放在临时表中,该表包含每个单词的行(用空格分隔)
然后内部加入主表。
答案 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);
这会计算匹配数并确保所有组件都匹配。
您可以向SELECT
和GROUP BY
添加更多列,以获取更多列。
注意:
以下更简单的版本适用于您的示例:
select t1.*
from t1
where t1.name like '%' + replace(@ModelName, ' ', '%') + '%';