Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server TSQL中的多个LIKE语句_Sql Server_Tsql_User Defined Functions_Sql Like - Fatal编程技术网

Sql server TSQL中的多个LIKE语句

Sql server TSQL中的多个LIKE语句,sql-server,tsql,user-defined-functions,sql-like,Sql Server,Tsql,User Defined Functions,Sql 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中实现这一点,它接受所有搜索词的逗号分隔参数 我尝试将该参数拆

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

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

如果你需要我说得更具体一些,请告诉我

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


谢谢

如果所有其他操作都失败,您可以在
@SearchTerms
上运行光标,并在结果上循环,检查每个项目是否存在于结果中

您很可能不会有太多的搜索项目(5-6个非常罕见),因此与在文本上反复运行
like
相比,光标成本应该可以忽略不计。这也不应该太贵


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

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

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)个搜索词,因为你只有两列要匹配?搜索词的数量可以是无限的。例如,我可以搜索“白色塑料杯”。因此,对于每个术语,ProductName或SKU必须匹配。希望是有道理的,但没有道理。为什么只有两列可以匹配所有三个不同的搜索词?这不可能是你描述它的方式。@seanxe,别理他,这很有道理。@rbaryyoung,这不是
=
,而是
像“%…%”
,意思是“包含”。他基本上是在两个有多个关键字的字段中进行正常的文本搜索。如果你想要一个在两个字段(页面标题和页面内容)中搜索多个单词的例子,请访问谷歌。谢谢你的建议。我一直试图避开光标,因为我似乎总是读到关于性能的不好的东西,但我可以看到你从哪里来:搜索词的数量。我现在肯定会去看一看。这个网站最初是LINQtoSQL的,只是因为负载太大而受到惩罚,所以我们决定把它全部转移到sql中——性能的提升是巨大的。同样值得指出的是,这个问题只是一个大得多的查询的一小部分。不过,感谢您的回答,让我们思考一下游标。它至少是一个快速实现的解决方案,而您在研究其他内容时(如果您仍然觉得有必要),应该有6行代码。