(У меня нет установки SQL-сервера, чтобы попытаться CONTAINS
Вы можете заменить column LIKE '%string%'
с CONTAINS(column, 'string')
и попробовать..)
See all queries here.
Очередное обновление - После чтения другие ответы и руководство, кажется, что вам не нужны значения в скобках в строке сложения, в отличие от ожидаемого. Так это должно работать слишком - (вы можете даже попробовать ' | '
вместо ' 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(......)
в качестве второго аргумента.
Update согласно измененному вопрос -
Во-первых, вы должны двигаться логику приложения ле vel если возможно. Я думаю, это слишком много, чтобы справиться с этим здесь. Я придумал этот запрос, но обратите внимание, что это разделит каждое слово и будет искать его как в 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"'
Предыдущий ответ:
Это будет предполагает, что слово после последнего пространства является description
и остальное является `имя.
Вы можете разбить строку поиска и использовать их, как показано ниже. Этот запрос использует like
, поскольку у меня нет установки sql-сервера.
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)
почему дон 'использовать для переменных один для«ABC 24», а другой для«Супермаркет» – danisius
У меня есть только один входной ящик для строки поиска. И пользователям должно быть возможно также войти в «Супермаркет ABC 24». – Tys
Вы считаете конкатенатом поля, которое ищете, вместо того, чтобы разбивать строку поиска? Что-то вроде WHERE CONTAINS ((CO. [Description] + '' + 'CA. [Description], CO. [Name]), @SearchString)? – Twelfth