Sql 如何检索匹配的单词文本搜索
如何检索文字搜索行。例如,如果我将输入搜索为“water Bottel”,我需要像“water Soap Bottel”、“water Milk Bottel”、“water Copper Bottel”这样的输出。我知道如何使用LIKE操作符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,
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%'
如果列/数据库/服务器的折叠不区分大小写,则可以使用ommitLOWER(…)
函数。可以在空格上拆分数据,并搜索拆分的单词是否与拆分的产品名称匹配:
如果所有搜索词必须匹配:
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 )