Utilisez '=' ou LIKE pour comparer des chaînes dans SQL?

169

Il y a la discussion (presque religieuse), si vous devez utiliser LIKE ou '=' pour comparer des chaînes dans des instructions SQL.

  • Y a-t-il des raisons d'utiliser LIKE?
  • Y a-t-il des raisons d'utiliser '='?
  • Performance? Lisibilité?
Guerda
la source

Réponses:

126

Pour voir la différence de performances, essayez ceci:

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

La comparaison des chaînes avec '=' est beaucoup plus rapide.

Techmaddy
la source
5
Woops ... d'accord, j'ai compris. Tableau avec ~ 600 entrées, nombre à 10 chiffres comme champ de comparaison: Equal est 20 à 30 fois plus rapide!
guerda
194

LIKEet les opérateurs d'égalité ont des objectifs différents, ils ne font pas la même chose:
=est beaucoup plus rapide, alors qu'ils LIKEpeuvent interpréter des jokers. Utilisez =partout où vous le pouvez et LIKEoù vous le devez.

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

Exemples de matchs:

TestUser1
TestUser2
TestU
Test

soulmerge
la source
37

Dans ma petite expérience:

"=" pour les correspondances exactes.

"LIKE" pour les matchs partiels.

Stu Andrews
la source
5
= n'est pas sensible à la casse
fanchyna
14

Il y a quelques autres astuces que Postgres propose pour la correspondance de chaînes (si cela se trouve être votre DB):

ILIKE, qui est une correspondance LIKE insensible à la casse:

select * from people where name ilike 'JOHN'

Allumettes:

  • John
  • John
  • JOHN

Et si vous voulez vraiment devenir fou, vous pouvez utiliser des expressions régulières:

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

Allumettes:

  • John
  • Johnathon
  • Johnny
Plafond
la source
1
Pour autant que je sache, les expressions régulières et les mots clés similaires ont des performances moins bonnes que '='
Ceilingfish
Typo 'ilike' to 'like'
Salah Alshaal
9

Juste comme un avertissement, l'opérateur '=' remplira les chaînes avec des espaces dans Transact-SQL. Ainsi 'abc' = 'abc 'reviendra vrai; 'abc' LIKE 'abc 'retournera faux. Dans la plupart des cas, «=» sera correct, mais dans un cas récent, ce n'était pas le cas.

Ainsi, tandis que '=' est plus rapide, LIKE pourrait indiquer plus explicitement vos intentions.

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

Philippe H
la source
7

Pour la correspondance de modèle, utilisez LIKE. Pour une correspondance exacte =.

Techmaddy
la source
6

LIKEest utilisé pour la correspondance de modèle et =est utilisé pour le test d'égalité (tel que défini par le COLLATIONen cours d'utilisation).

=peut utiliser des index alors que les LIKErequêtes nécessitent généralement de tester chaque enregistrement de l'ensemble de résultats pour le filtrer (sauf si vous utilisez la recherche en texte intégral), ce =qui améliore les performances.

Mehrdad Afshari
la source
4

LIKE fait correspondre comme les jokers char [*,?] Au shell
LIKE '% suffix' - donnez-moi tout ce qui se termine par un suffixe. Vous ne pouvez pas faire ça avec =
dépend du cas en fait.

Gishu
la source
3

Il y a une autre raison d'utiliser "comme" même si les performances sont plus lentes: les valeurs de caractère sont implicitement converties en entier lors de la comparaison, donc:

déclarer @transid varchar (15)

si @transid! = 0

vous donnera une erreur "La conversion de la valeur varchar '123456789012345' a débordé une colonne int".

Uniotter
la source