Verwenden Sie '=' oder LIKE, um Zeichenfolgen in SQL zu vergleichen?

169

Es gibt die (fast religiöse) Diskussion, ob Sie LIKE oder '=' verwenden sollten, um Zeichenfolgen in SQL-Anweisungen zu vergleichen.

  • Gibt es Gründe, LIKE zu verwenden?
  • Gibt es Gründe, '=' zu verwenden?
  • Performance? Lesbarkeit?
Guerda
quelle

Antworten:

126

Versuchen Sie Folgendes, um den Leistungsunterschied festzustellen:

SELECT count(*)
FROM master..sysobjects as A
JOIN tempdb..sysobjects as B
on A.name = B.name

SELECT count(*)
FROM master..sysobjects as A
JOIN tempdb..sysobjects as B
on A.name LIKE B.name

Der Vergleich von Zeichenfolgen mit '=' ist viel schneller.

Techmaddy
quelle
5
Woops ... okay, ich habe den Punkt verstanden. Tabelle mit ~ 600 Einträgen, 10-stellige Zahl als Vergleichsfeld: Gleich ist 20- bis 30-mal schneller!
Guerda
194

LIKEund der Gleichheitsoperator hat unterschiedliche Zwecke, sie tun nicht dasselbe:
=ist viel schneller, wohingegen LIKEPlatzhalter interpretiert werden können. Verwenden =Sie, LIKEwo immer Sie können und wo immer Sie müssen.

SELECT * FROM user WHERE login LIKE 'Test%';

Beispielübereinstimmungen:

TestUser1
TestUser2
TestU
Test

Soulmerge
quelle
37

Nach meiner kleinen Erfahrung:

"=" für genaue Übereinstimmungen.

"LIKE" für Teilübereinstimmungen.

Stu Andrews
quelle
5
= unterscheidet nicht zwischen Groß- und Kleinschreibung
Fanchyna
14

Es gibt noch ein paar andere Tricks, die Postgres für den String-Abgleich anbietet (falls dies zufällig Ihre Datenbank ist):

ILIKE, bei dem die Groß- und Kleinschreibung nicht berücksichtigt wird:

select * from people where name ilike 'JOHN'

Streichhölzer:

  • John
  • John
  • JOHN

Und wenn Sie wirklich wütend werden möchten, können Sie reguläre Ausdrücke verwenden:

select * from people where name ~ 'John.*'

Streichhölzer:

  • John
  • Johnathon
  • Johnny
Deckenfisch
quelle
1
Soweit mir bekannt ist, haben reguläre Ausdrücke und ähnliche Keywords eine schlechtere Leistung als '='
Ceilingfish
Tippfehler 'ilike' zu 'like'
Salah Alshaal
9

Nur als Heads-Up füllt der Operator '=' Zeichenfolgen mit Leerzeichen in Transact-SQL. Also 'abc' = 'abc 'wird wahr zurückkehren; 'abc' LIKE 'abc 'wird false zurückgeben. In den meisten Fällen ist '=' korrekt, in einem meiner jüngsten Fälle jedoch nicht.

Während '=' schneller ist, könnte LIKE Ihre Absichten expliziter angeben.

http://support.microsoft.com/kb/316626

Philip H.
quelle
7

Verwenden Sie für den Mustervergleich LIKE. Für genaue Übereinstimmung =.

Techmaddy
quelle
6

LIKEwird für den Mustervergleich verwendet und =wird für den Gleichheitstest verwendet (wie durch den COLLATIONverwendeten definiert).

=kann Indizes verwenden, während LIKEAbfragen normalerweise das Testen jedes einzelnen Datensatzes in der Ergebnismenge erfordern, um ihn herauszufiltern (es sei denn, Sie verwenden die Volltextsuche), um =eine bessere Leistung zu erzielen.

Mehrdad Afshari
quelle
4

LIKE passt wie Wildcards char [*,?] An der Shell
LIKE '% Suffix' - gib mir alles, was mit Suffix endet. Das konnte man nicht machen mit =
Kommt auf den Fall an.

Gishu
quelle
3

Es gibt noch einen weiteren Grund für die Verwendung von "Gefällt mir", auch wenn die Leistung langsamer ist: Zeichenwerte werden beim Vergleich implizit in Ganzzahlen konvertiert.

deklariere @transid varchar (15)

if @transid! = 0

Sie erhalten den Fehler "Die Konvertierung des Varchar-Werts '123456789012345' hat eine int-Spalte übergelaufen".

Uniotter
quelle