Frage

enter image description here

Ich habe eine Tabelle mit den folgenden Texten und das Schlüsselwort, nach dem ich suche, ist 'Search'. 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 der Suche im Text zurückgegeben werden und nicht "lSEARCH" erfolgen sollte. dh gemäß den ersten drei Datensätzen, nur um zurückgegeben zu werden.

War es hilfreich?

Lösung

Benutze wie

  • Einzelzeile wie Suche:

    WHERE
     ' ' + [TextValue] + ' ' LIKE '%[.,;:() ]Search[.,;:() ]%'
    
    /* [] contains list of allowable characters, adding spaces around 
       [TextValue] removes need to have multiple OR [TextValue] LIKE */
    
  • Ohne Polsterung müssen Sie die Zeichenfolge, die bei Start/Ende der String angezeigt wird, speziell verarbeiten:

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

Verwenden von FullText Index

Edit2, für die vollständigen Textpuristen

CREATE FULLTEXT INDEX Auf MSDN -Zuständen für die Auto -Option (die Standardeinstellung)

Obwohl Änderungen automatisch ausgebildet werden, werden diese Änderungen möglicherweise nicht sofort im Volltextindex reflektiert.

Es kann also keine korrekten Ergebnisse liefern. Aber ein paar Sekunden später wird es es tun.

Außerdem wird es bis zu ein paar 10K -Reihen angemessen erfolgen: IT skaliert o (n). Ich benutze das gleiche auf einem Tisch mit rund 25.000 Zeilen, aber Benutzer wissen, dass es schlecht funktioniert, wenn sie auf diese Weise suchen (es ist auf einer "erweiterten" Seite). Ich gewinne im Kompromiss, indem ich einen Volltextindex verwaltet

Volltextsuche ist nicht das Richtige Lösung, es ist eines Möglichkeit

Notiz: Die Erfahrung hat mir gezeigt, dass die FullText -Indexierung in SQL Server schwerwiegende Auswirkungen auf die Leistung hat. (@Andrew Bickerton)

Andere Tipps

Wenn Ihre Tabelle eine nicht triviale Anzahl von Zeilen hat, möchten Sie stattdessen möglicherweise einen FullText-Index ausprobieren. Es wird viel schneller sein und genau mit dem genauen Wort übereinstimmen.

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 auf:

Ich weiß nicht, ob SQL Server unterstützt wird \b in regexes (übereinstimmen auf Word Boundry). Und du musst musst Erstellen Sie eine benutzerdefinierte Funktion, mit der das Regex -Übereinstimmung in erster Linie angepasst werden kann, Aber wenn dies der Fall ist, könnten Sie miteinander übereinstimmen:

\bSearch\b

Wenn dies nicht der Fall ist, sollten Sie immer noch in der Lage sein, miteinander übereinzustimmen:

(^| )Search( |$)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top