(我没有安装 sql-server 可以尝试CONTAINS
。你可以替换为column LIKE '%string%'
并CONTAINS(column, 'string')
尝试。)
在此处查看所有查询。
另一个更新- 在阅读其他答案和手册之后,您似乎不需要包含字符串中的括号值,这与我预期的不同。所以这也应该有效 - (你甚至可以尝试' | '
而不是' OR '
SELECT CO.name, CA.description FROM company CO
INNER JOIN category CA
ON CA.CategoryId = CO.CategoryId
WHERE CONTAINS((CO.name,CO.description), REPLACE('ABC 25 SuperMarket', ' ', ' OR '))
AND
CONTAINS(CA.description, REPLACE('ABC 25 SuperMarket', ' ', ' OR '))
如果它在替换附近抱怨语法错误,您可以创建一个搜索字符串DECLARE @SearchString varchar(MAX) = REPLACE('ABC 25 SuperMarket',' ', ' OR ')
,然后将其replace(......)
用作第二个参数。
根据您修改后的问题进行更新-
首先,如果可能,您应该将逻辑移动到应用程序级别。我想,在这里处理它太多了。我提出了这个查询,但请注意,这将拆分每个单词并在两者中搜索它,name
因此description
您最终会得到比您想象的更多的结果。例如,与在我之前的查询中仅返回一个名称相比,这将返回所有名称中具有Supermarket
或ABC
名称的所有内容。这实际上应该可以帮助您,因为根据您的说法,用户可能只需键入24
Supermarket
ABC 24
"ABC Supermarket 24" or "24 ABC Supermarket" or ...
DECLARE @SearchString varchar(MAX) = 'ABC 24 SuperMarket'
DECLARE @separator varchar(MAX) = ' '
DECLARE @Like1 varchar(MAX) = 'CO.name LIKE'
DECLARE @Like2 varchar(MAX) = 'CA.description LIKE'
DECLARE @WHERE1 varchar(MAX) = '( ' + @Like1 + ' ''%' +
REPLACE(@SearchString,@separator,'%'' OR ' + @Like1 + ' ''%')+'%'')'
DECLARE @WHERE2 varchar(MAX) = '( ' + @Like2 + ' ''%' +
REPLACE(@SearchString,@separator,'%'' OR ' + @Like2 + ' ''%')+'%'')'
DECLARE @QueryString varchar(MAX) =
CONCAT('SELECT CO.name, CA.description FROM company CO
INNER JOIN category CA
ON CA.CategoryId = CO.CategoryId
WHERE ', @WHERE1, ' AND ', @WHERE2)
exec(@QueryString);
如果你输出@WHERE1
你应该看到
( CO.name LIKE '%ABC%' OR CO.name LIKE '%25%' OR CO.name LIKE '%SuperMarket%')
正如我之前所说,您可能想尝试使用CONTAINS
带括号的值,例如
DECLARE @SearchString varchar(MAX) = 'ABC 25 SuperMarket'
DECLARE @separator varchar(MAX) = ' '
DECLARE @WHEREString varchar(MAX) = '''"' +
REPLACE(@SearchString, @separator, '" OR "')+'"'''
SELECT CO.name, CA.description FROM company CO
INNER JOIN category CA
ON CA.CategoryId = CO.CategoryId
WHERE CONTAINS((CO.name,CO.description), @WHEREString)
AND
CONTAINS(CA.description, @WHEREString)
如果你输出@WHEREString
你应该看到
'"ABC" OR "25" OR "SuperMarket"'
上一个答案:
这将假定最后一个空格之后的单词是 the description
,其余的是 `name。
您可以拆分搜索字符串并使用它们,如下所示。like
由于我没有安装 sql-server,因此正在使用此查询。
DECLARE @SearchString VARCHAR(100) = 'ABC 24 Supermarket'
DECLARE @searchLength int = len(@SearchString)
DECLARE @searchReverse VARCHAR(100) = reverse(@SearchString)
SELECT CO.name, CA.description FROM company CO
INNER JOIN category CA
ON CA.CategoryId = CO.CategoryId
WHERE CO.name LIKE concat( '%', SUBSTRING(@SearchString,0,@searchLength-charindex(' ',@searchReverse)+1), '%')
AND
CA.description LIKE concat( '%', SUBSTRING(@SearchString,@searchLength-charindex(' ',@searchReverse)+2,@searchLength), '%')
这应该有效。请注意 where 子句使用 AND 而不是 OR。
DECLARE @SearchString VARCHAR(100) = 'ABC 24 Supermarket'
DECLARE @searchLength int = len(@SearchString)
DECLARE @searchReverse VARCHAR(100) = reverse(@SearchString)
DECLARE @company VARCHAR(100) = SUBSTRING(@SearchString,0,@searchLength-charindex(' ',@searchReverse)+1)
DECLARE @category VARCHAR(100) = SUBSTRING(@SearchString,@searchLength-charindex(' ',@searchReverse)+2,@searchLength)
SELECT CO.name, CA.description FROM company CO
INNER JOIN category CA
ON CA.CategoryId = CO.CategoryId
WHERE CONTAINS((CO.name, CO.description), @company)
AND
CONTAINS(CA.description , @category)