Use '=' ou LIKE para comparar seqüências de caracteres no SQL?


169

Há a discussão (quase religiosa), se você deve usar LIKE ou '=' para comparar seqüências de caracteres nas instruções SQL.

  • Existem razões para usar o LIKE?
  • Existem razões para usar '='?
  • Atuação? Legibilidade?

Respostas:


126

Para ver a diferença de desempenho, tente o seguinte:

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 cadeias de caracteres com '=' é muito mais rápido.


5
Woops ... ok, eu entendi. Tabela com ~ 600 entradas, número de 10 dígitos como campo de comparação: igual é 20 a 30 vezes mais rápido!
Guerda

194

LIKEe o operador de igualdade tem propósitos diferentes, eles não fazem a mesma coisa:
=é muito mais rápido, ao passo que LIKEpodem interpretar curingas. Use =sempre que puder e LIKEonde precisar.

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

Correspondências de amostra:

TestUser1
TestUser2
TestU
Teste


37

Na minha pequena experiência:

"=" para correspondências exatas.

"LIKE" para correspondências parciais.


5
= Não é caso sensível
fanchyna

14

Existem alguns outros truques que o Postgres oferece para correspondência de strings (se esse for o seu banco de dados):

ILIKE, que é uma correspondência LIQ que não diferencia maiúsculas de minúsculas:

select * from people where name ilike 'JOHN'

Partidas:

  • John
  • John
  • JOHN

E se você quiser ficar realmente bravo, pode usar expressões regulares:

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

Partidas:

  • John
  • Johnathon
  • Johnny

1
Tanto quanto eu estou ciente da expressão regular e como palavras-chave têm pior desempenho do '='
Ceilingfish

Typo 'ilike' to 'like'
Salah Alshaal

9

Assim como um aviso, o operador '=' preencherá cadeias de caracteres com espaços no Transact-SQL. Então 'abc' = 'abc ', retornará verdadeiro; 'abc' LIKE 'abc 'retornará falso. Na maioria dos casos, '=' estará correto, mas em um caso recente meu não estava.

Portanto, embora '=' seja mais rápido, o LIKE pode indicar mais explicitamente suas intenções.

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


7

Para correspondência de padrões, use LIKE. Para correspondência exata =.


6

LIKEé usado para correspondência de padrões e =é usado para teste de igualdade (conforme definido pelo COLLATIONem uso).

=pode usar índices enquanto as LIKEconsultas geralmente exigem o teste de cada registro no conjunto de resultados para filtrá-lo (a menos que você esteja usando a pesquisa de texto completo) para obter =um melhor desempenho.


4

LIKE faz correspondência como caracteres curinga char [*,?] No shell
LIKE '% suffix' - me dá tudo o que termina com sufixo. Você não poderia fazer isso com =
Depende do caso, na verdade.


3

Há outro motivo para usar "like", mesmo que o desempenho seja mais lento: os valores dos caracteres são implicitamente convertidos em número inteiro quando comparados, portanto:

declare @transid varchar (15)

if @transid! = 0

fornecerá um erro "A conversão do valor varchar '123456789012345' excedeu a capacidade de uma coluna int".

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.