Sql 如何检索匹配的单词文本搜索

Sql 如何检索匹配的单词文本搜索,sql,sql-server,Sql,Sql Server,如何检索文字搜索行。例如,如果我将输入搜索为“water Bottel”,我需要像“water Soap Bottel”、“water Milk Bottel”、“water Copper Bottel”这样的输出。我知道如何使用LIKE操作符 IF OBJECT_ID('tempdb..#SearchText') IS NOT NULL DROP TABLE #SearchText CREATE TABLE #SearchText ( ProductId INT,

如何检索文字搜索行。例如,如果我将输入搜索为“water Bottel”,我需要像“water Soap Bottel”、“water Milk Bottel”、“water Copper Bottel”这样的输出。我知道如何使用LIKE操作符

IF OBJECT_ID('tempdb..#SearchText') IS NOT NULL
    DROP TABLE #SearchText



CREATE TABLE #SearchText
(
    ProductId INT,
    ProductName VARCHAR(500)
)

INSERT INTO #SearchText VALUES

    (1,'Water Soap Bottel'),
    (2,'Water Milk Bottel'),
    (3,'Wooden Box'),
    (4,'Water Plastic Bottel'),
    (5,'Water Copper Bottel')
您可以这样做:

DECLARE @SearchTerm VARCHAR(100) = 'water bottel'

SELECT *
FROM #SearchText
WHERE ProductName LIKE '%' + REPLACE(@SearchTerm, ' ', '%') + '%'
但是,如果您还需要返回一行,其中包含短语
bottel water
,则这些单词的顺序将意味着上述操作无效。在这种情况下,您需要将查询分解为多个单词,例如:

SELECT *
FROM #SearchText
WHERE ProductName LIKE '%water%'
AND ProductName LIKE '%bottel%'
如果您的桌子上有一张桌子,您可以使用:


使用类似于运算符的

SELECT
    *
FROM #SearchText
WHERE LOWER(ProductName) LIKE '%water%'
        AND LOWER(ProductName) LIKE '%bottel%'

如果列/数据库/服务器的折叠不区分大小写,则可以使用ommit
LOWER(…)
函数。

可以在空格上拆分数据,并搜索拆分的单词是否与拆分的产品名称匹配:

如果所有搜索词必须匹配:

SELECT *
FROM   #SearchText st
WHERE  ( SELECT COUNT(value)
         FROM   STRING_SPLIT('water Bottel', ' ') ) = ( SELECT COUNT(*)
                                                        FROM   STRING_SPLIT(st.ProductName, ' ') AS sv
                                                        JOIN   STRING_SPLIT('water Bottel', ' ') AS ss
                                                          ON sv.value = ss.value ) 
如果一个或多个单词必须匹配:

SELECT *
FROM   #SearchText st
WHERE  EXISTS ( SELECT 1
                FROM   STRING_SPLIT(st.ProductName, ' ') AS sv
                JOIN   STRING_SPLIT('water Bottel', ' ') AS ss
                  ON sv.value = ss.value ) 

注:SQL Server 2016内置了
string\u split
功能,如果使用较低版本,您可以搜索并创建自定义实现。

是否还需要返回
bottel water
?@DavidG是的,我需要单词匹配可能值得注意,这仅适用于SQL Server 2016及更高版本(当然有一个适当的同胞级别)G、 根据我输入的“Water Batter”它正在工作,但例如,如果我输入“Water Batter Cap”。我需要与“Water Soap Bottel”、“Water Milk Bottel”、“Water Copper Bottel”相同的记录,因为存在单词匹配。我期望的是我需要单词匹配,如果存在,则需要总输入,否则需要单词匹配。你的意思是
WHERE PProductName='water bottel'或(…上面显示的内容…)
?是的,David,总输入匹配以及单词匹配,例如,如果输入一行作为“water bottel Cap”。我需要这一行以及单词匹配的剩余行,如水或瓶子等…这就是您的答案。
SELECT *
FROM   #SearchText st
WHERE  EXISTS ( SELECT 1
                FROM   STRING_SPLIT(st.ProductName, ' ') AS sv
                JOIN   STRING_SPLIT('water Bottel', ' ') AS ss
                  ON sv.value = ss.value )