7

これは、最も単純な形式で達成しようとしているものです。

SELECT 
    p.ProductId,
    p.ProductName,
    p.SKU
FROM tbl_Product p
WHERE (p.ProductName LIKE '%white%' OR p.SKU LIKE '%white%')
AND (p.ProductName LIKE '%cup%' OR p.SKU LIKE '%cup%')

すべての検索語のコンマ区切りのパラメーターを受け入れる UDF でこれを実行しようとしています。

そのパラメーターを一時テーブルに分割して、次のように結合しようとしました。

DECLARE @SearchText nvarchar(1000) SELECT @SearchText='white,cup'

DECLARE @SearchTerms TABLE (String nvarchar(200))
INSERT INTO @SearchTerms (String)
SELECT '%' + String + '%' FROM dbo.CsvSplitString(@SearchText)

SELECT 
    p.ProductId,
    p.ProductName,
    p.SKU
FROM tbl_Product p
JOIN @SearchTerms s ON (p.ProductName LIKE s.String OR p.SKU LIKE s.String)

しかし、それは私が望むものを返しません.名前またはSKUが検索用語のいずれかに一致するレコードを返します. 名前または SKU がすべての検索用語に一致する最初のクエリのように返す必要があります (これは理にかなっていると思います)。

正しい方向へのプッシュに大いに感謝します-より具体的にする必要がある場合はお知らせください.

注: 現時点では、全文検索は実行可能なオプションではありません。

ありがとう!

4

2 に答える 2

4

以下のクエリはそれを行うはずですが、最速ではないかもしれません!

DECLARE @SearchText nvarchar(1000) SELECT @SearchText='white,cup'
DECLARE @keywords TABLE (keyword nvarchar(255))
DECLARE @keywordCount int

INSERT INTO @keywords (keyword) SELECT * FROM dbo.CsvSplitString(@SearchText)
SET @keywordCount = (SELECT COUNT(*) FROM @keywords)


SELECT *
FROM tbl_Product p
WHERE EXISTS
    (SELECT *
    FROM
        (SELECT productId
        FROM tbl_Product, @keywords
        WHERE productname like '%' + keyword + '%' or sku like '%' + keyword + '%' 
        GROUP BY productid
        HAVING COUNT(*) = @keywordCount
        ) matches 
    WHERE p.ProductId=matches.ProductId
    )
于 2012-04-24T15:02:44.007 に答える
0

他のすべてが失敗した場合は、カーソルを実行@SearchTermsして結果をループし、各項目が結果に存在するかどうかを確認できます。

ほとんどの場合、多くの検索項目はありません (5 ~ 6 は非常にまれです)。そのため、カーソルのコストはlike、テキストを何度も実行する場合と比較して無視できるはずです。そして、それはあまりにも高価であってはなりません。

編集:過去に検索のために行ったことは、ストアドプロシージャに依存するのではなく、クエリをプレーンテキストでサーバーに送信することでした。これにより、条件を自分でまとめることができました。必要に応じて、動的クエリとexecサーバーで同じことを行うことができます。この方法はかなりハッキリしているようで、パフォーマンスが向上したことは明らかではありません。思考の糧。

于 2012-04-24T14:45:39.853 に答える