¿Usar '=' o ME GUSTA para comparar cadenas en SQL?

169

Existe la discusión (casi religiosa), si debe usar LIKE o '=' para comparar cadenas en declaraciones SQL.

  • ¿Hay razones para usar LIKE?
  • ¿Hay razones para usar '='?
  • ¿Actuación? ¿Legibilidad?
guerda
fuente

Respuestas:

126

Para ver la diferencia de rendimiento, intente esto:

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

Comparar cadenas con '=' es mucho más rápido.

Techmaddy
fuente
55
Woops ... está bien, tomé el punto. Tabla con ~ 600 entradas, número de 10 dígitos como campo de comparación: ¡Igual es de 20 a 30 veces más rápido!
guerda
194

LIKEy el operador de igualdad tiene diferentes propósitos, no hacen lo mismo:
=es mucho más rápido, mientras que LIKEpuede interpretar comodines. Úselo =donde pueda y LIKEdonde deba.

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

Muestra de coincidencias:

TestUser1
TestUser2
TestU
Test

soulmerge
fuente
37

En mi pequeña experiencia:

"=" para coincidencias exactas.

"ME GUSTA" para Partidos Parciales.

Stu Andrews
fuente
55
= no
distingue entre
14

Hay un par de otros trucos que Postgres ofrece para la coincidencia de cadenas (si ese es su DB):

ILIKE, que es un partido LIKE sin distinción entre mayúsculas y minúsculas:

select * from people where name ilike 'JOHN'

Partidos:

  • Juan
  • Juan
  • JUAN

Y si quieres enojarte mucho, puedes usar expresiones regulares:

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

Partidos:

  • Juan
  • Johnathon
  • Johnny
Pez techo
fuente
1
Hasta donde sé, la expresión regular y las palabras clave similares tienen un rendimiento peor que '='
Ceilingfish
Typo 'ilike' to 'like'
Salah Alshaal
9

Al igual que un aviso, el operador '=' rellenará cadenas con espacios en Transact-SQL. Entonces 'abc' = 'abc 'volverá verdadero; 'abc' LIKE 'abc 'devolverá falso. En la mayoría de los casos, '=' será correcto, pero en un caso reciente mío no lo fue.

Entonces, mientras '=' es más rápido, LIKE podría indicar más explícitamente sus intenciones.

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

Philip H
fuente
7

Para la coincidencia de patrones use LIKE. Para coincidencia exacta =.

Techmaddy
fuente
6

LIKEse usa para la coincidencia de patrones y =se usa para la prueba de igualdad (como se define COLLATIONen uso).

=puede usar índices, mientras que las LIKEconsultas generalmente requieren probar cada registro en el conjunto de resultados para filtrarlo (a menos que esté utilizando la búsqueda de texto completo) para que =tenga un mejor rendimiento.

Mehrdad Afshari
fuente
4

LIKE hace coincidir como comodines char [*,?] En el shell
LIKE '% sufijo' - dame todo lo que termine con sufijo. No podría hacer eso con =
Depende del caso en realidad.

Gishu
fuente
3

Hay otra razón para usar "me gusta" incluso si el rendimiento es más lento: los valores de los caracteres se convierten implícitamente en enteros en comparación, por lo que:

declarar @transid varchar (15)

si @transid! = 0

le dará un error "La conversión del valor varchar '123456789012345' desbordó una columna int".

Uniotter
fuente