WIE Sie die unabhängige Existenz des Wortes an einer beliebigen Stelle im Text auswählen können

7

Geben Sie hier die Bildbeschreibung ein

Ich habe eine Tabelle mit den folgenden Texten und das Schlüsselwort, nach dem ich suche, ist 'Suche'. Also habe ich eine Abfrage geschrieben

SELECT [ID]
  ,[TextValue]
FROM
   [dbo].[SearchLike]
WHERE
   [TextValue] LIKE '%Search%'

Q.1 Wie kann ich die Abfrage so ändern, dass nur die Datensätze mit "Suche" im Text zurückgegeben werden und nicht "LSearch" verwendet werden sollte? dh gemäß dem Bild werden die ersten drei Datensätze nur zurückgegeben.

balu
quelle
Da Search und LSearch ein Ersatzparameter sind (glaube ich), verwenden Sie: sz NICHT WIE '% LSearch%' UND sz LIKE '% Search%'
garik
Gute Frage, da vielen von uns die verfügbaren Platzhalterzeichen, die mit LIKE verwendet werden können, nicht bekannt sind. Ich füge diesen Link / diese Referenz hinzu , die jedem helfen kann, der mehr darüber wissen möchte.
CoderHawk
und eine von msdn
CoderHawk

Antworten:

8

Verwenden von LIKE

  • Einzeilige Suche:

    WHERE
     ' ' + [TextValue] + ' ' LIKE '%[.,;:() ]Search[.,;:() ]%'
    
    /* [] contains list of allowable characters, adding spaces around 
       [TextValue] removes need to have multiple OR [TextValue] LIKE */
  • Ohne Auffüllen müssen Sie speziell mit Zeichenfolgen umgehen, die am Anfang / Ende der Zeichenfolge erscheinen:

    WHERE
        [TextValue] LIKE '%Search%' --middle
        OR
        [TextValue] LIKE 'Search%'   --start
        OR
        [TextValue] LIKE '%Search'   --end

Verwenden von FULLTEXT INDEX

Edit2 für die Volltextpuristen

CREATE FULLTEXT INDEX auf MSDN-Status für die Option AUTO (Standardeinstellung)

Obwohl Änderungen automatisch weitergegeben werden, werden diese Änderungen möglicherweise nicht sofort im Volltextindex wiedergegeben.

Daher gibt es möglicherweise keine korrekten Ergebnisse. Aber dann ein paar Sekunden später wird es.

Für bis zu einige 10k-Zeilen ist die Leistung ausreichend: Es wird O (n) skaliert. Ich verwende das LIKE für eine Tabelle mit etwa 25.000 Zeilen, aber Benutzer wissen, dass es schlecht funktioniert, wenn sie auf diese Weise suchen (es befindet sich auf einer "erweiterten" Seite). Ich gewinne den Kompromiss durch die Verwaltung eines Volltextindex

Die Volltextsuche ist nicht die richtige Lösung, sondern eine Option

Hinweis: Die Erfahrung hat mir gezeigt, dass die FullText-Indizierung in SQL Server schwerwiegende Auswirkungen auf die Leistung hat, dh: Nur implementieren, wenn Sie dies wirklich benötigen und wissen, was Sie tun! (@ Andrew Bickerton)

gbn
quelle
Es sieht gut aus. Aber gibt es eine andere Möglichkeit, es durch Platzhalterausdrücke zu bringen? Eigentlich implementiere ich es in einer Suchabfrage. Und versuche, die Codezeile zu reduzieren.
Balu
Ich habe versucht, Leerzeichen hinzuzufügen, aber es wird nicht der erste Datensatz zurückgegeben, dh das Schlüsselwort am Anfang des Textes.
Balu
@balu: Führen Sie genau diesen Code nach meiner Bearbeitung aus?
Gbn
Ich mag keine Downvoter. Mach dir keine Sorgen. Wenn meine schnelle Antwort falsch war, danke ich Ihnen für kaltes Wasser. Ich hatte keine Zeit, meine Antwort schnell zu beantworten (zu bearbeiten).
Garik
2
Dies ist keine skalierbare Lösung. In verwendet einen Index- oder Tabellenscan. Wenn die Tabelle wächst, wird die Zeit, die zum Durchsuchen der Tabelle benötigt wird, dramatisch zunehmen. Die angezeigte Volltextoption sollte verwendet werden.
Mrdenny
6

Wenn Ihre Tabelle eine nicht triviale Anzahl von Zeilen enthält, können Sie stattdessen einen FULLTEXT-Index verwenden. Es wird viel schneller sein und genau auf das Wort passen.

CREATE FULLTEXT CATALOG <catalog_name> AS DEFAULT;

CREATE FULLTEXT INDEX ON [dbo].[SearchLike](TextValue)
    KEY INDEX pk_id; --requires the existing of a PK or UQ index with this name on this table

Suchen Sie nun nach Ihrem Text:

SELECT [ID]
  ,[TextValue]
FROM
   [dbo].[SearchLike]
WHERE
   CONTAINS([TextValue], 'Search')

Mehr zu:

Eric Humphrey - Lotsahelp
quelle
Die Volltextsuche in SQL Server ist die einzige effiziente Möglichkeit, die Daten zu durchsuchen. Jede andere Möglichkeit, die ich mir vorstellen kann, würde einen Index- oder Tabellenscan erfordern.
Mrdenny
1

Ich weiß nicht, ob SQL Server \bRegexes unterstützt (Übereinstimmung mit Wortgrenzen). Und Sie müssen eine benutzerdefinierte Funktion erstellen, um den Regex-Abgleich überhaupt zu ermöglichen. Wenn dies jedoch der Fall ist, können Sie Folgendes tun :

\bSearch\b

Wenn dies nicht der Fall ist, sollten Sie weiterhin in der Lage sein, Folgendes zu tun:

(^| )Search( |$)
Joe
quelle
1
Derzeit unterstützt SQL Server keine native Regex-Suche mit LIKE. CLR ist eine Option, aber eine langsame.
Eric Humphrey - Lotsahelp