TSQL中的多个LIKE语句

这是我试图以最简单的形式实现的:

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中执行此操作,该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匹配所有搜索条件(我认为这很有意义)。

会大量赞赏推向正确的方向 - 让我知道你是否需要我更具体。

注意:全文搜索目前不是一个可行的选项。

谢谢!


下面的查询应该这样做,但它可能不是最快的!

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
    )

如果一切都失败了,您可以在@SearchTerms运行游标并遍历结果,检查每个项目是否存在于结果中。

你很可能不会有很多的搜索项(5-6会如此罕见的),所以相比运行成本光标应该是微不足道的like一遍又一遍地在你的文字。 而且这也不应该太昂贵。

编辑:我过去为搜索所做的工作是将查询以纯文本形式发送到服务器,而不是依赖存储过程,所以我可以自己拼凑我的条件。 如果您愿意,您可以在服务器上exec动态查询和exec 。 这种方式看起来很不好,并不明显,这是一个性能改进。 食物的思想。

链接地址: http://www.djcxy.com/p/58987.html

上一篇: Multiple LIKE statements in TSQL

下一篇: Meteor how to invoke client js function for only item added to Collection