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

时间:2018-05-31 17:20:23

标签: sql sql-server stored-procedures

想象一下,我有一个逗号分隔的字符串列表,如@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'

2 个答案:

答案 0 :(得分:1)

搜索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;

答案 1 :(得分:0)

如果您坚持使用此数据库设计,我建议您操作以逗号分隔的字符串以创建查询字符串,并将其传递给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注入的攻击。<​​/ p>

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

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