我有20个(或更多)单词(字符串)的列表,想要选择在其列的3个中包含这些单词的行。我应该使用like
sql的表达式。但我不知道如何在类似的表达式中使用多个字符串。(我现在使用它union
,但是我至少有60条select语句,并认为它降低了性能,真的降低了性能吗?)
//get the advertise that have similar keywords
foreach (string str in keywords)
{
if (str != "")
{
if (!string.IsNullOrEmpty(sqlQuery)) sqlQuery += " union";
sqlQuery = "select * from AD_Advertise where (AdKeyWords like N'%" + str + "%'"
+ " OR AdTitle like N'%" + str + "%' "
+ " OR AdDescription like N'%" + str + "%' "
+ " OR AdGroupItemCode=" + adinfo.AdGroupItemCode + ")"
+ " AND AdSiteID=" + CMSContext.CurrentSiteID
+ " AND AdShow='True' "
+ " AND ItemID != " + ADId;
}
}
ds = cn.ExecuteQuery(sqlQuery,null);//("AD.Advertise.selectall", null, where, "ItemModifiedWhen");
最后,我使用了以下代码:
if object_id('tempdb..#WordList') is not null
drop table #WordList
CREATE TABLE #WordList ( KeyWord nvarchar(100))
insert into #WordList values (N'حقوقی'),(N'وکیل');
SELECT DISTINCT *
FROM AD_ADvertise a
LEFT JOIN #WordList k
ON a.AdKeywords LIKE '%' + k.KeyWord + '%'
OR a.AdTitle LIKE '%' + k.KeyWord + '%'
OR a.AdDescription LIKE '%' + k.KeyWord + '%'
WHERE
(k.KeyWord IS NOT NULL OR a.AdGroupItemCode = @AdGroupItemCode)
AND a.AdSiteId = @AdSiteId
AND a.AdShow = 'True'
AND a.ItemId != @ItemId
;drop table #WordList
创建一个具有表值参数的存储过程,该参数采用您的字符串列表。
在表值参数和您的表AD_Advertise之间建立联接。
以下是表格类型和存储过程的操作方法:
CREATE TYPE WordList AS TABLE (Word NVARCHAR(50));
GO
CREATE PROCEDURE GetAddsMatchingKeywords
@KeywordList WordList READONLY,
@AdGroupItemCode VARCHAR(50),
@AdSiteId INT,
@ItemId INT
AS
SELECT DISTINCT
a.AdTitle,
a.ItemId -- extend to the full column list
FROM AD_ADvertise a
LEFT JOIN @KeywordList k ON a.AdKeywords LIKE '%' + k.Word + '%' OR a.AdTitle LIKE '%' + k.Word + '%' OR a.AdDescription LIKE '%' + k.Word + '%'
WHERE
(k.Word IS NOT NULL OR a.AdGroupItemCode = @AdGroupItemCode)
AND a.AdSiteId = @AdSiteId
AND a.AdShow = 'True'
AND a.ItemId = @ItemId
GO
编辑-误读了原始问题-以为您想匹配3个或更多的单词。此版本与3列中任何一个单词都相同的单词相匹配-就像您想的那样。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句