(試してみる sql-server インストールがありませんCONTAINS
。 を に置き換えて試すことができcolumn LIKE '%string%'
ますCONTAINS(column, 'string')
。 )
ここですべてのクエリを参照してください。
別の更新- 他の回答とマニュアルを読んだ後、予想とは異なり、contains 文字列に括弧で囲まれた値は必要ないようです。' | '
したがって、これも機能するはずです-(代わりに試すこともできます' 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 '))
replace の近くで構文エラーが発生する場合は、検索文字列を作成し、それを 2 番目の引数DECLARE @SearchString varchar(MAX) = REPLACE('ABC 25 SuperMarket',' ', ' OR ')
の代わりに使用できます。replace(......)
変更された質問に従って更新します-
まず、可能であれば、ロジックをアプリケーション レベルに移動する必要があります。ここで扱うには多すぎると思います。私はこのクエリを思いつきましたが、これは各単語を分割して両方で検索するため、name
思っdescription
たよりも多くの結果が得られることに注意してください。たとえば、これは、前のクエリで名前を持つ1 つだけを返すのと比較して、名前にまたはを含むすべて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
これは、最後のスペースの後の単語が theで、残りが「名前」であると想定します。
以下に示すように、検索文字列を分割して使用できます。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 句は OR ではなく AND を使用していることに注意してください。
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)