在列中搜索部分文本

时间:2019-10-03 00:57:11

标签: sql sql-server

我在管理系统中有一个搜索字段,用户可以在其中输入搜索条件来查找要在其商店中进行编辑的产品。一些产品名称很长且相似。例如,我有多个带有测量值的产品名称。这是一个示例:

Widget Brown Bull Edge Stone 400x500x600 
Widget Brown Bull Snow Stone 700x500x300 

大约有一百种这样的产品,名称相似,但颜色,尺寸或描述仅略有变化。

不幸的是,我尝试使用regEx,不幸的是,我也尝试了LIKE的变体。

我希望能够在HTML表单字段中输入搜索条件,并使用SQL根据输入的搜索条件的数量来限制结果。

例如,如果我输入:

在搜索字段中输入“ Widget Brown 400”,我无法在where子句中使用%like%,因为它与该模式不匹配。

我的理想结果是输入Widget Brown 400,结果列表将显示那些符合搜索条件的产品。

1 个答案:

答案 0 :(得分:0)

如Gordon Linoff所说,最好的方法是为SQL-Server全文搜索做好准备。

除此之外,另一种不太优雅且性能较低的解决方案是使用table valued function STRING_SPLIT()(在SQL Server 2016中可用),将搜索词转换为派生表,然后搜索文本中的每个单词使用LIKE。如果所有搜索到的单词都出现在文本中,则说明匹配。

考虑:

SELECT * 
FROM mytable t
WHERE NOT EXISTS (
     SELECT 1
     FROM STRING_SPLIT(@search, ' ') x
     WHERE t.txt NOT LIKE '%' + x.value + '%'
);

Demo on DB Fiddle

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 | Widget Brown Bull Edge Stone 400x500x600