这是我试图以最简单的方式实现的目标:
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与任一搜索项匹配的任何记录。我需要它像第一个查询一样返回,其中Name或SKU匹配所有搜索词(我认为这是有意义的)。
大力赞赏正确方向的推动 - 让我知道你是否需要我更具体。
注意:目前全文搜索不是一个可行的选择。
谢谢!
答案 0 :(得分: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
)
答案 1 :(得分:0)
如果所有其他方法都失败了,您可以在@SearchTerms
上运行光标并循环显示结果,检查每个项目是否存在于结果中。
您很可能不会有很多搜索项目(5-6会非常罕见),因此与在文本上反复运行like
相比,游标成本应该可以忽略不计。这也不应该太贵。
编辑:我过去为搜索做的是将查询以纯文本形式发送到服务器而不是依赖存储过程,所以我可以自己拼凑我的条件。如果您愿意,可以在服务器上使用动态查询和exec
执行相同的操作。这种方式看起来非常hacky,并不是显而易见的是性能提升。值得深思。