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