1

我有一个包含 20 个(或更多)单词(字符串)的列表,并且想要选择在其列的 3 个中包含这些单词的行。我应该使用likesql 的表达式。但我不知道如何在like 表达式中使用多个字符串。(我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
4

3 回答 3

1
  1. 永远不要建立这样的 SQL 字符串。在继续之前阅读有关 SQL 注入的信息。
  2. 理想情况下,您应该有一个关键字表,而不是一个字符串,以及一个用于链接项目和关键字的连接表。
  3. 如果您坚持这样做,请查看全文搜索
于 2013-10-22T13:40:15.077 回答
1

使用带有字符串列表的表值参数创建一个存储过程。

在表值参数和您的表 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 列中的任何一个中包含单个单词的任何内容 - 就像我想的那样。

于 2013-10-22T13:42:04.110 回答
0
    //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 + AdTitle + 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");
于 2013-10-22T13:40:04.530 回答