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

文字列のリストを取得するテーブル値パラメーターを持つストアド プロシージャを作成します。

テーブル値パラメーターとテーブル 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 つの列のいずれかに 1 つの単語が含まれているものと一致します - あなたが望んでいたように。

于 2013-10-22T13:42:04.110 に答える
1
  1. そのような SQL 文字列を構築しないでください。先に進む前に、SQL インジェクションについて読んでください。
  2. 理想的には、文字列ではなくキーワードのテーブルと、アイテムとキーワードをリンクするための結合テーブルが必要です。
  3. この方法に固執する場合は、全文検索をご覧ください
于 2013-10-22T13:40:15.077 に答える