我在管理系统中有一个搜索字段,用户可以在其中输入搜索条件来查找要在其商店中进行编辑的产品。一些产品名称很长且相似。例如,我有多个带有测量值的产品名称。这是一个示例:
Widget Brown Bull Edge Stone 400x500x600
Widget Brown Bull Snow Stone 700x500x300
大约有一百种这样的产品,名称相似,但颜色,尺寸或描述仅略有变化。
不幸的是,我尝试使用regEx,不幸的是,我也尝试了LIKE的变体。
我希望能够在HTML表单字段中输入搜索条件,并使用SQL根据输入的搜索条件的数量来限制结果。
例如,如果我输入:
在搜索字段中输入“ Widget Brown 400”,我无法在where子句中使用%like%,因为它与该模式不匹配。
我的理想结果是输入Widget Brown 400,结果列表将显示那些符合搜索条件的产品。
答案 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 + '%'
);
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