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