【问题标题】:Multiple LIKE statements in TSQLSQL 中的多个 LIKE 语句
【发布时间】:2012-05-05 05:17:56
【问题描述】:

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

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 匹配所有搜索词(我认为这是有道理的)。

非常感谢您朝着正确的方向前进 - 如果您需要我更具体一些,请告诉我。

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

谢谢!

【问题讨论】:

  • 如果您需要“匹配所有搜索词”,这是否意味着您只能有两 (2) 个搜索词,因为您只有两列要匹配?
  • 搜索词的数量可以是无限的。例如,我可以搜索“白色塑料杯”。因此,对于每个术语,ProductName 或 SKU 必须匹配。希望这是有道理的。
  • 这没有意义。怎么可能只有两列匹配三个不同搜索词的全部?不可能像你描述的那样。
  • @seanxe,忽略他,这很有意义。
  • @RBarryYoung,不是=,是like '%...%',意思是“包含”。他基本上是在具有多个关键字的 2 个字段中进行正常的文本搜索。如果您想要在两个字段(页面标题和页面内容)中搜索多个单词的示例,请查看 Google。

标签: sql-server tsql user-defined-functions sql-like


【解决方案1】:

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

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
    )

【讨论】:

    【解决方案2】:

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

    您很可能不会有很多搜索项(5-6 会非常少),因此与在文本上一遍又一遍地运行 like 相比,光标成本应该可以忽略不计。这也不应该太贵。

    编辑:我过去所做的搜索是以纯文本形式将查询发送到服务器,而不是依赖存储过程,所以我可以自己拼凑我的条件。如果您愿意,您可以对服务器上的动态查询和exec 执行相同的操作。这种方式看起来很老套,而且性能提升并不明显。值得深思。

    【讨论】:

    • 感谢您的建议。我一直试图避开光标,因为我似乎总是读到关于性能的不好的东西,但我可以看到你从哪里来:搜索词的数量。我现在一定会看看的。
    • 该站点最初是在 linq to sql 中,只是在负载下受到惩罚,所以我们决定将它全部移到 sql 中 - 性能提升是巨大的。值得指出的是,这个问题只是更大查询的一小部分。不过,感谢您的回答,游标值得深思。
    • 它至少是一个快速实施的解决方案,而您正在研究其他东西(如果您仍然觉得需要它),应该像 6 行代码。
    猜你喜欢
    • 1970-01-01
    • 2017-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多