Sql 在列中搜索部分文本
我在管理系统中有一个搜索字段,用户可以在其中输入搜索条件,以查找要在其店铺内编辑的产品。有些产品名称很长且相似。例如,我有多个产品名称,其中包含度量值。以下是一个例子:Sql 在列中搜索部分文本,sql,sql-server,Sql,Sql Server,我在管理系统中有一个搜索字段,用户可以在其中输入搜索条件,以查找要在其店铺内编辑的产品。有些产品名称很长且相似。例如,我有多个产品名称,其中包含度量值。以下是一个例子: Widget Brown Bull Edge Stone 400x500x600 Widget Brown Bull Snow Stone 700x500x300 像这样的产品大约有一百种,名称相似,颜色、尺寸或描述都略有不同 我尝试过使用正则表达式,但运气不好,我也尝试过类似的变体 我希望能够在我的HTML表单字段中输入
Widget Brown Bull Edge Stone 400x500x600
Widget Brown Bull Snow Stone 700x500x300
像这样的产品大约有一百种,名称相似,颜色、尺寸或描述都略有不同
我尝试过使用正则表达式,但运气不好,我也尝试过类似的变体
我希望能够在我的HTML表单字段中输入搜索条件,并使用SQL根据我输入的搜索条件数量限制结果
例如,如果我输入:
搜索字段中的“Widget Brown 400”我不能在where子句中使用%like%,因为它与该模式不匹配
我的理想结果是输入Widget Brown 400,结果列表将显示符合该搜索条件的产品。正如Gordon Linoff所言,最好的方法是满足于SQL Server全文搜索 除此之外,另一个不太优雅且性能较差的解决方案是使用(在SQL Server 2016中提供),将搜索词转换为派生表,然后使用
之类的搜索文本中的每个单词。如果文本中存在所有搜索的单词,则您有一个匹配项
考虑:
SELECT *
FROM mytable t
WHERE NOT EXISTS (
SELECT 1
FROM STRING_SPLIT(@search, ' ') x
WHERE t.txt NOT LIKE '%' + x.value + '%'
);
CREATE TABLE mytable (id int, txt varchar(max));
INSERT INTO mytable VALUES
(1, 'Widget Brown Bull Edge Stone 400x500x600'),
(2, 'Widget Brown Bull Snow Stone 700x500x300');
DECLARE @search NVARCHAR(400) = 'Widget Brown 400';
SELECT *
FROM mytable t
WHERE NOT EXISTS (
SELECT 1
FROM STRING_SPLIT(@search, ' ') x
WHERE t.txt NOT LIKE '%' + x.value + '%'
);
id| txt
-: | :---------------------------------------
1 |小部件棕色牛缘石400x500x600
你应该对你正在使用的数据库进行全文搜索。如果你有足够的预算,很高兴建议进行全文搜索。我正在AWS Lightsail实例上使用SQL Server 2016。用空格分割你的输入,并为你的查询中的每个“词”添加一个类似于
的条件,怎么样,将它们与和结合起来?我喜欢这个解决方案谢谢GMB。但产品名称和尺寸在不同的栏位。例如,“小部件棕色牛缘石”和“400x500x600”位于两个不同的列中。对不起,我没说清楚。我该如何修改该解决方案以适应这种情况。@WebsiteBuilder:您可以在搜索前将列连接起来,例如WHERE t.product_name+t.size,例如“%”+x.val+“%”
id | txt
-: | :---------------------------------------
1 | Widget Brown Bull Edge Stone 400x500x600