Rechercher des mots dans l'index SQL Server
-
03-07-2019 - |
Question
J'ai besoin de quelque chose entre une recherche en texte intégral et une recherche dans l'index:
Je souhaite rechercher du texte dans une colonne de mon tableau (il y aura probablement un index sur la colonne également, si cela importe).
Le problème est que je veux rechercher des mots dans la colonne, mais je ne veux pas faire correspondre les parties.
Par exemple, ma colonne peut contenir des noms d'entreprise:
Mighty Muck Miller et Partenaires Inc.
Boy & amp; Compagnie de petit déjeuner au beurre
Maintenant, si je cherche " Miller " Je veux trouver la première ligne. Mais si je recherche " iller " Je ne veux pas le trouver, car il n'y a pas de mot qui commence par "iller". Recherche de " Pause " devrait trouver " Boy & amp; Butter Breakfast company ", cependant, puisqu’un mot commence par" Pause ".
Donc si j'essaie d'utiliser
WHERE BusinessName LIKE %Break%
il trouvera trop de résultats.
Existe-t-il un moyen de rechercher des mots séparés par des espaces ou par d'autres délimiteurs ?
(LINQ serait le meilleur choix, mais un langage SQL simple le ferait aussi)
Important: Les espaces ne sont de loin pas les seuls délimiteurs! Les barres obliques, les deux points, tous les caractères non alphanumériques doivent être pris en compte pour que cela fonctionne!
La solution
SQL Server 2000 ou supérieur.
SELECT *
FROM dbo.TblBusinessNames
WHERE BusinessName like '%[^A-z^0-9]Break%' -- In the middle of a sentence
OR BusinessName like 'Break%' -- At the beginning of a sentence
Référence de mot-clé pour LIKE : http://msdn.microsoft.com/en-us/library/aa933232 (SQL.80) .aspx
Autres conseils
Vos délimiteurs de mots vont être nombreux: espace, tabulation, début de ligne, parenthèses, points, virgules, points d’exclamation, etc. Une solution assez simple consiste donc à utiliser une expression régulière dans votre clause WHERE. (Et cela va être beaucoup plus efficace que de simplement ordonner tous les délimiteurs possibles auxquels vous pouvez penser.)
Puisque vous avez mentionné LINQ, voici un article décrivant la procédure à suivre pour expression rationnelle efficace. interroger avec SQL Server .
Les clauses WHERE compliquées comme celle-ci me font toujours peur en ce qui concerne les performances. Je suggère donc définitivement de faire une analyse comparative, mais vous pouvez décider de créer un index de recherche pour la colonne.
MODIFIER: vous avez modifié votre question. Lorsque vous écrivez votre regex , il est facile de lui faire utiliser n'importe quel caractère non alphanum comme délimiteur, c'est-à-dire [^ 0-9a-zA-Z], ou \ W pour tout caractère autre qu'un mot, \ b pour une limite de mot et \ B pour toute limite de non-mot. Ou, au lieu de faire correspondre les délimiteurs, faites simplement correspondre n'importe quel mot, à savoir \ w +. Voici un autre exemple d'une personne effectuant des recherches sur les expressions rationnelles avec SQL Server ( plus compliqué que ce dont vous auriez besoin).
where BusinessName like 'Break%' -- to find if it is beginning with the word
or BusinessName like '% Break%' -- to find if it contains the word anywhere but the beginning
WHERE BusinessName LIKE '% Break%'
Vous avez mentionné LINQ - vous pourriez faire quelque chose comme ...
string myPattern = "% Break%";
var query =
from b in Business
where SqlMethods.Like(b.BusinessName, myPattern)
select b;
Notez que ceci utilise l'espace de noms System.Linq.Data.SqlClient
qui se traduit directement par l'opérateur LIKE
sans traitement supplémentaire.
Essayez ceci:
declare @vSearch nvarchar(100)
set @vSearch = 'About'
select * from btTab where ' ' + vText + ' ' LIKE '%[^A-z^0-9]' + @vSearch + '[^A-z^0-9]%'