Использовать '=' или LIKE для сравнения строк в SQL?

169

Существует обсуждение (почти религиозное), если вы должны использовать LIKE или '=' для сравнения строк в операторах SQL.

  • Есть ли причины использовать LIKE?
  • Есть ли причины использовать «=»?
  • Производительность? Читаемость?
guerda
источник

Ответы:

126

Чтобы увидеть разницу в производительности, попробуйте это:

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

Сравнение строк с '=' намного быстрее.

Techmaddy
источник
5
Woops ... хорошо, я понял. Таблица с ~ 600 записями, 10-значным числом как поле сравнения: равно в 20-30 раз быстрее!
Guerda
194

LIKEи оператор равенства имеет разные цели, они не делают одно и то же:
=намного быстрее, тогда как LIKEмогут интерпретировать подстановочные знаки. Используйте, =где вы можете и LIKEгде вы должны.

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

Образцы матчей:

TestUser1
TestUser2
TestU
Test

soulmerge
источник
37

По моему небольшому опыту:

"=" для Точных Матчей.

«НРАВИТСЯ» для частичных матчей.

Стю Эндрюс
источник
5
= не чувствительна к регистру
fanchyna
14

Postgres предлагает несколько других приемов для сопоставления строк (если это ваша БД):

ILIKE, который является нечувствительным к регистру LIKE совпадением:

select * from people where name ilike 'JOHN'

Спички:

  • Джон
  • Джон
  • JOHN

И если вы хотите по-настоящему злиться, вы можете использовать регулярные выражения:

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

Спички:

  • Джон
  • Джонатон
  • Джонни
Ceilingfish
источник
1
Насколько мне известно, регулярное выражение и подобные ключевые слова имеют худшую производительность, чем '='
Ceilingfish
Опечатайте «ilike» на «лайк»
Салах Альшаал
9

Оператор '=' будет заполнять строки пробелами в Transact-SQL. Так 'abc' = 'abc 'вернется правда; 'abc' LIKE 'abc 'вернет ложь. В большинстве случаев «=» будет правильным, но в моем недавнем случае это не так.

Таким образом, хотя '=' быстрее, LIKE может более явно указать ваши намерения.

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

Филипп Н
источник
7

Для сопоставления с образцом используйте LIKE. Для точного соответствия.

Techmaddy
источник
6

LIKEиспользуется для сопоставления с образцом и =используется для проверки на равенство (как определено COLLATIONв использовании).

=Можно использовать индексы, в то время как LIKEзапросы обычно требуют тестирования каждой отдельной записи в наборе результатов, чтобы отфильтровать ее (если вы не используете полнотекстовый поиск), поэтому =имеет лучшую производительность.

Мехрдад Афшари
источник
4

LIKE выполняет сопоставление как символы подстановки char [*,?] В оболочке.
LIKE '% суффикс' - дайте мне все, что заканчивается суффиксом. Вы не можете сделать это с =
Зависит от случая на самом деле.

Gishu
источник
3

Существует еще одна причина использования «лайка», даже если производительность ниже: символьные значения неявно преобразуются в целое при сравнении, поэтому:

объявить @transid varchar (15)

если @transid! = 0

выдаст ошибку «Преобразование значения varchar« 123456789012345 »переполнило столбец int».

Uniotter
источник