Frage

Ich brauche etwas zwischen einer Volltextsuche und Indexsuche:
Ich mag für Text in einer Spalte von meinem Tisch suchen (wahrscheinlich wird es ein Index für die Spalte sein, auch wenn es ankommt).

Das Problem ist, ich will für Wörter in der Spalte suchen, aber ich will nicht Teile passen.

Zum Beispiel meiner Spalte könnten Firmennamen enthalten:
   Mighty Muck Miller and Partners Inc.
  Boy & Butter Frühstück Unternehmen

Nun, wenn ich nach „ Miller “ Ich mag die erste Zeile zu finden. Aber wenn ich nach „ iller “ Ich will nicht, um es zu finden, denn es gibt kein Wort mit „Iller“ ab ist. Die Suche nach " Break " sollte finden " Boy & Butter Frühstück Unternehmen ", obwohl, da ein Wort beginnt mit " Break ".

Also, wenn ich versuche, und verwenden

WHERE BusinessName LIKE %Break%

wird es finden zu viele Treffer.

Gibt es eine Möglichkeit für Wörter durch ein Leerzeichen oder andere Trennzeichen getrennt zu suchen?

(LINQ wäre am besten, einfach SQL tun würde, auch)

Wichtig: Die Räume sind bei weitem nicht die einzigen Trennzeichen! Schrägstriche, Doppelpunkte, Punkte, alle nicht-alphanumerischen Zeichen sollten dafür in Betracht gezogen werden, um zu arbeiten!

War es hilfreich?

Lösung

SQL Server 2000 oder höher.

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

Keyword Referenz für LIKE :

Andere Tipps

Ihre Worttrennzeichen werden viele sein: Leerzeichen, Tabulator, Zeilenanfang, Klammern, Punkte, Kommas, Ausrufezeichen / Fragezeichen usw. Also eine ziemlich einfache Lösung ist es, eine Regex in Ihrer WHERE-Klausel zu verwenden. (Und es wird viel effizienter sein als jeden möglichen Begrenzer ORing man sich vorstellen kann.)

Da Sie LINQ erwähnt, hier ist ein Artikel, der beschreibt, wie effizienten Regex tun Abfragen mit SQL Server .

Komplizierte WHERE-Klauseln wie dies immer eine rote Fahne mit mir erheben, soweit die Leistung betrifft, so schlage ich vor, auf jeden Fall das Benchmarking, was Sie am Ende mit, können Sie entscheiden, schließlich einen Suchindex für die Spalte zu bauen.

EDIT: Saw Sie Ihre Frage bearbeitet. Wenn Ihre regex zu schreiben, ist es leicht, einfach es jede nicht-alphanum Zeichen als Trennzeichen verwenden, dh [^ 0-9a-zA-Z], oder \ W für jede nicht-Wortzeichen, \ b für jede Wortgrenze und \ B für all nicht-Wort-Grenze. Oder statt Begrenzern passenden, entspricht nur jedes Wort, das heißt \ w +. Hier ein weiteres Beispiel von jemandem regex Suche mit SQL Server zu tun ( Je komplizierter als das, was Sie brauchen würden).

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%'

Sie haben erwähnt, LINQ - man könnte etwas tun, wie ...

string myPattern = "% Break%";

var query =
      from b in Business
      where SqlMethods.Like(b.BusinessName, myPattern) 
      select b;

Beachten Sie, dass dies die System.Linq.Data.SqlClient Namespace verwendet, die direkt den LIKE Betreiber ohne zusätzliche Verarbeitung übersetzt.

Versuchen Sie folgendes:

declare @vSearch nvarchar(100)

set @vSearch = 'About'

select * from btTab where ' ' + vText + ' ' LIKE '%[^A-z^0-9]' + @vSearch + '[^A-z^0-9]%'
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top