Like und "=" für übereinstimmende Zeichenfolgen mit SQL Server

7

Immer, wenn ich eine gespeicherte Prozedur schreibe, um Daten basierend auf einer String-Variablen (varchar, nvarchar, char) auszuwählen, würde ich etwas wie:

haben %Vor%

Also mit anderen Worten, um die Aufzeichnung zu treffen, hätte ich

%Vor%

Aber manchmal stoße ich auf Code, der LIK E anstelle von =

verwendet %Vor%

Wann würdest du es benutzen? Sollte das nicht nur verwendet werden, wenn Sie einen Wildcard-Abgleich benötigen?

BEARBEITEN

Danke für die Antworten.

Ich denke, dass ich klarstellen muss, dass das, was ich wirklich zu fragen versuchte, war: wenn es eine Situation geben könnte, in der es bevorzugt wurde, anstelle von "=" genaues String-Matching zu verwenden. Von den Antworten konnte ich sagen, dass es keine geben würde. Aus meiner eigenen Erfahrung würde ich selbst in Situationen, in denen ich z. B. den Fall und führende und endende Leerzeichen ignorieren muss, ltrim, rtrim, auf beiden Strings und dann "=" verwenden. Nochmals vielen Dank für Ihre Eingabe.

    
kristof 19.11.2008, 16:13
quelle

9 Antworten

13

Sie haben Recht. Es gibt keinen Vorteil bei der Verwendung von LIKE, es sei denn, Sie führen einen Wildcard-Abgleich durch. Darüber hinaus kann die Verwendung ohne Platzhalter zur Verwendung eines ineffizienten Abfrageplans führen.

    
Aheho 19.11.2008, 16:20
quelle
7

Sunny hat es fast geschafft :)

Führen Sie in QA in einer Standardinstallation von SQL2005

Folgendes aus %Vor%

Also stimmt LIKE nicht mit nachfolgenden Leerzeichen überein, auf der Seite des Abfrageplans funktionieren beide fast gleich, aber der Join '=' ist ein kleines bisschen besser.

Eine weitere Sache, die Sie bei der Verwendung von LIKE beachten sollten, ist, dass Sie Ihre Saite ordnungsgemäß verlassen.

%Vor%

Im Allgemeinen verwenden Leute LIKE nicht für genaues Matching, weil die austretenden Probleme alle Arten von Komplikationen und subtilen Fehlern verursachen, die Menschen vergessen zu entkommen und es gibt eine Welt voller Schmerzen.

Aber ... wenn Sie eine wirklich exakte Übereinstimmung suchen, die effizient ist, kann LIKE das Problem lösen.

Sagen Sie, Sie möchten den Benutzernamen mit "sam" vergleichen und nicht "Sam" oder "Sam" erhalten, und unglücklicherweise wird bei der Sortierung der Spalte nicht zwischen Groß- und Kleinschreibung unterschieden.

Etwas wie das Folgende (mit der Flucht hinzugefügt) ist der Weg zu gehen.

%Vor%

Der Grund für eine doppelte Übereinstimmung besteht darin, einen Tabellenscan zu vermeiden.

Wie auch immer ....

Ich denke das Varbinary Casting Trick ist weniger anfällig für Fehler und leichter zu merken.

    
Sam Saffron 20.11.2008 01:11
quelle
3

Wenn keine Platzhalter verwendet werden, besteht der Unterschied darin, dass "=" eine exakte Übereinstimmung ergibt, aber LIKE eine Zeichenfolge mit nachfolgenden Leerzeichen (von SSBO) abgleicht:

  

Wenn Sie Zeichenfolgenvergleiche ausführen   mit LIKE, alle Charaktere in der   Musterzeichenfolge sind signifikant,   einschließlich führender oder nachstehender Leerzeichen.   Wenn ein Vergleich in einer Abfrage durchgeführt werden soll   gebe alle Zeilen mit einer LIKE-Zeichenfolge zurück   'abc' (abc gefolgt von einem einzelnen   Leerzeichen), eine Zeile, in der der Wert von   Diese Spalte ist abc (abc ohne a   Leerzeichen) wird nicht zurückgegeben. Jedoch,   nachgestellte Leerzeichen, im Ausdruck zu   dem das Muster zugeordnet ist, sind   ignoriert. Wenn ein Vergleich in einer Abfrage ist   um alle Zeilen mit der Zeichenfolge zurückzugeben   LIKE 'abc' (abc ohne Leerzeichen), alles   Zeilen, die mit abc beginnen und null haben   oder mehr abschließende Leerzeichen werden zurückgegeben.

    
Sunny Milenov 19.11.2008 17:09
quelle
2

Mit dem Schlüsselwort LIKE können Sie stattdessen das Feld u.username mit einem bestimmten Muster vergleichen einer festen "Zeichenfolge".

    
bruno conde 19.11.2008 16:18
quelle
2

Wenn Sie dies im Code anderer Leute sehen, können sie vielleicht einer Person erlauben, einen String mit einem Muster oder Platzhaltern zu übergeben.

    
Tom H 19.11.2008 18:54
quelle
1

Ja - Sie haben Recht - es sollte nur für den Wildcard-Abgleich verwendet werden. Es sollte sparsam verwendet werden, vor allem bei sehr großen Tabellen auf nicht indizierten Feldern, da es Ihre Suchanfragen verlangsamen kann.

    
silverbugg 19.11.2008 16:22
quelle
1

Ich stieß auf das gleiche Problem. Es dauerte etwa anderthalb Minuten, um eine ähnliche Abfrage mit = auszuführen. Wenn ich = in like änderte, war die Abfrage viel schneller.

  • Versuchen Sie, einen Index für die Spalte zu erstellen, mit der Sie vergleichen. Dies beschleunigte die Abfrage erheblich.
  • Versuchen Sie, sp_updatestats auszuführen. In meinem Fall hat dies dazu geführt, dass die Abfrage in ca. 6 Sekunden mit = ohne den Index und fast sofort mit dem Index ausgeführt wurde.
Chad Carisch 06.12.2013 15:36
quelle
0

LIKE steht für Wildcard-Matching, wobei as = (equals) für eine exakte Übereinstimmung steht.

Ich denke auch, dass es für Felder verwendet wurde, die von FULL TEXT CATALOGS für harte Kernstringvergleiche katalogisiert wurden.

    
Pure.Krome 20.11.2008 01:13
quelle
-1

Ja, soweit ich weiß, ist die Verwendung von "Like" ohne Platzhalter identisch mit dem Operator "=". Sind Sie sicher, dass der Eingabeparameter keine Platzhalter enthält?

    
Kevin 19.11.2008 16:21
quelle

Tags und Links