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!

Était-ce utile?

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]%'
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top