2016-04-04 10 views
-2

ich mehrere Wort auf bestimmte Spalte ausführen möchten. Die angegebene Suchzeichenfolge kann in anderer Reihenfolge sein. Zum Beispiel möchte ich den Buchnamen "Harry Potter Dream world" aus der Buch-Tabelle mit einem ähnlichen Operator und einem regulären Ausdruck suchen.Suche mit mehreren Wörtern in einer bestimmten Spalte mit regulären Ausdrücken in SQL Server

Ich weiß, mehrere wie Operator wir den Betrieb mit unter Abfrage

SELECT * 
FROM TABLE_1 
WHERE bookname LIKE 'Harry Potter' OR LIKE 'Heaven world' 

In diesem Fall führen können, ich dies in einer einzigen Abfrage ausgeführt werden soll. Auch ich habe versucht mit FREETEXT Optionen. Das wird nicht nützlich sein, wenn ich Self-Join verwende. Bitte geben Sie mir andere Alternativen, um dies zu lösen.

Sie können auch zur Verfügung stellen, wie reguläre Ausdrücke verwenden, um mehr Wort in SQL Server zu suchen. Ich habe es mit mehreren Optionen versucht. Es wird nicht für mich funktionieren.

+0

Bitte stellen Sie ein Testszenario zur Verfügung ... Wie sollte die Abfrage wissen, was zusammen gehört und was nicht ("Harry Potter" wird nicht "Potter Harry" sein und Sie wollen wahrscheinlich nicht "Dirty Harry" finden, nur weil es einen gibt "Harry" da drin)? Sie müssen mehr Details angeben, sonst wird dies schnell geschlossen ... – Shnugo

+0

Dies ist genau wie enthält Suche. Ich meine, wie auch immer der Autor sagt, wir müssen alle Unterlagen von der DB mitbringen. Entweder du kannst Harry Potter oder Potter Harry oder Welttraum oder Traumwelt geben. usw. Ich möchte alle Datensätze, die eines der Wörter oder alle Wörter enthält. –

+0

Immer noch nicht klar ... Aber möchten Sie wirklich "Harry's Dream" finden? In deinem Beispiel ** weißt du, dass "Harry Potter" und "Traumwelt" zwei Bücher sind, aber ** die arme Frage kann das nicht wissen **. Was ist mit "Ein Sommernachtstraum World of Warcraft". Du möchtest auch "Traumwelt" finden? – Shnugo

Antwort

1

Wie wäre es dieses ...

DECLARE @phrase nvarchar(max) = 'Harry Potter Dream world' 

;WITH words AS (
    SELECT word = y.i.value('(./text())[1]', 'nvarchar(4000)') 
    FROM ( 
     SELECT x = 
      CONVERT(XML, '<i>' 
       + REPLACE(@phrase, ' ', '</i><i>') 
       + '</i>').query('.') 
    ) AS a CROSS APPLY x.nodes('i') AS y(i) 
) 
SELECT * 
FROM 
    TABLE_1 
    CROSS APPLY (
     SELECT found = 1 
     FROM words 
     WHERE bookname like '%' + word + '%') search 
+1

Ich dachte an etwas Ähnliches, aber das ist weit zu gierig. Stellen Sie sich einen Suchstring wie "Über einen Jungen" vor. Sie würden alle Titel mit einem "a" finden ... Immer noch eine Aufwertung von meiner Seite wert ... – Shnugo

+0

BTW: Ihr CTE kann etwas einfacher sein. Keine Notwendigkeit für '.query ('.')', Keine Notwendigkeit für '.value ('(./ text()) [1]')'. Ich poste eine Antwort mit einem etwas einfacheren Anruf ... – Shnugo

+0

Natürlich ist alles, was Sie gesagt haben, gültig. Ich kopiere einfach etwas aus einer anderen Lösung und passe das Ding an. Ich will nicht denken, was wird es für „a“ in einem großen Tisch suchen wie folgt aussehen: D Allerdings ist die vernünftige Optimierung wäre alles rauszuschmeißen kürzer als 3-4 Buchstaben ... – OzrenTkalcecKrznaric

1

mit LIKE Suche nach sehr viele Treffer führen könnte, vor allem, wenn Sie mit einem Suchbegriff umgehen mit „das“ oder „a“ ...

Der folgende Code wird geteilt zuerst Ihre Suchbegriff in seine Worte, spaltete dann die Namen des Buches in die Worte und prüfen, ob volle Worttreffer

DECLARE @tbl TABLE(ID INT, BookName VARCHAR(100)); 
INSERT INTO @tbl VALUES 
(1,'Harry Potter') 
,(2,'Dream world') 
,(3,'A Midsumme Night''s Dream') 
,(4,'Some other Book') --will not be found 
,(5,'World of Warcraft'); 

DECLARE @phrase nvarchar(max) = 'Harry Potter o Dream world' 

;WITH words AS (
    SELECT word = z.i.value('.', 'nvarchar(max)') 
    FROM (SELECT CAST('<i>' + REPLACE(@phrase, ' ', '</i><i>') + '</i>' AS XML)) AS x(y) 
    CROSS APPLY x.y.nodes('/i') AS z(i) 
) 
SELECT * 
FROM @tbl AS tbl 
WHERE EXISTS 
(
    SELECT 1 
    FROM 
    (
     SELECT z.i.value('.', 'nvarchar(max)') 
     FROM (SELECT CAST('<i>' + REPLACE(tbl.BookName, ' ', '</i><i>') + '</i>' AS XML)) AS x(y) 
     CROSS APPLY x.y.nodes('/i') AS z(i) 
    ) AS checkWords(word) 
    WHERE EXISTS(SELECT 1 FROM words WHERE words.word=checkWords.word) 
) 
Verwandte Themen