用于使用多个赞在文本中搜索的存储过程(无全文搜索)



>想象一下,我有一个逗号分隔的字符串列表,例如@DSC='Watch,Water Proof,LED Screen',我想选择那些描述包含变量@DSC项目的记录。下面是一个简单的查询:

SELECT * FROM GoodInfo
WHERE Description LIKE '%Watch%'
AND Description LIKE '%Water Proof%'
AND Description LIKE '%LED Screen%'

以下是表格的列:

Id | Name | CategoryId | Description | Price

其中一个商品的示例描述字段如下所示:

Men's Digital Sports Watch LED Screen Large Face Military Watches and Waterproof Casual Luminous Stopwatch Alarm Simple Army

扩展此示例,您希望搜索具有更少或更多属性的逗号分隔字符串列表的商品。

我正在寻找的是一个存储过程,它将逗号分隔的字符串列表作为参数,然后将其拆分并根据获得的项目计数创建选择查询,因此我将执行以下命令:

EXEC SearchFor 'Watch,Water Proof,LED Screen,Digital'

搜索split()函数 . . .一个自SQL Server 2016以来可用。

然后你可以做:

SELECT *
FROM GoodInfo gi CROSS APPLY
(SELECT COUNT(*) as num_vals,
SUM(CASE WHEN description LIKE '%' + val + '%' THEN 1 ELSE 0 END) as num_matches
FROM (split_string(@DSC, ',')) ss(val)
) v
WHERE v.num_vals = n.num_matches;

如果您坚持使用此数据库设计,我建议您操作逗号分隔的字符串以创建查询字符串,并将其传递到sp_executesql。

CREATE PROCEDURE SearchFor   
@input nvarchar(max)
AS
SET NOCOUNT ON;
SELECT @input = REPLACE(@input, ',', ' AND Description LIKE ''%');
DECLARE @query nvarchar(max);
SET @query = 'SELECT * FROM GoodInfo WHERE Description LIKE ''%' + @input + '%''';
SET NOCOUNT OFF;
EXECUTE sp_executesql @query;
GO  

但最终,这些值可能应该在它们自己的列中,而不仅仅是转储到Comments中,在那里事情往往会丢失并且查询变得乏味。正如评论中指出的那样,此示例容易受到SQL注入的影响。

编辑:我学到了一些新东西!如果您使用的是 SQL Server 2008 或更高版本,则可以使用 CONTAINS 谓词,并使用"AND"而不是逗号来分隔列表:

CREATE PROCEDURE SearchFor   
@input nvarchar(max)
AS
SELECT * FROM GoodInfo WHERE CONTAINS(Description, @input)
GO  

最新更新