SQL LIKE sans aucun caractère générique identique à '='?
Question
Je sais que la question est assez fondamentale et je pense que je connais la réponse ... mais je voudrais confirmer.
Ces requêtes sont-elles vraiment équivalentes?
SELECT * FROM FOO WHERE BAR LIKE 'X'
SELECT * FROM FOO WHERE BAR ='X'
Peut-être y at-il un surcoût lié à la performance lorsqu’il est utilisé sans joker?
J'ai une application qui utilise facultativement LIKE & amp; jokers. Actuellement, le SP procède de la sorte et ajoute les caractères génériques. Je pense mettre à jour la requête pour qu’il soit utilisé de la même manière, mais que l’application ajoute les caractères génériques si nécessaire.
La solution
Comme @ocdecio le dit, si l'optimiseur est suffisamment intelligent, il ne devrait y avoir aucune différence, mais si vous voulez être sûr de ce qui se passe dans les coulisses, vous devez comparer les plans d'exécution de la requête.
Autres conseils
Réponse originale de Matt Whitfield de ici
Il existe une différence entre =
et LIKE
. Lorsque vous effectuez des comparaisons de chaînes à l'aide de LIKE
, tous les caractères de la chaîne de modèle sont significatifs. Cela inclut les espaces de début ou de fin.
Donc, si vous avez une colonne qui est char
ou nchar
et non nvarchar
ou varchar
, il y aura avoir des résultats différents en raison d'espaces de fin.
Petit exemple pour reproduire ce problème:
CREATE TABLE #temp (nam [varchar](MAX))
INSERT INTO [#temp] ([nam])
VALUES ('hello')
INSERT INTO [#temp] ([nam])
VALUES ('hello ')
SELECT * FROM #temp WHERE [nam] = 'hello '
SELECT * FROM #temp WHERE [nam] LIKE 'hello '
Tout bon optimiseur réduirait la première expression à la seconde.