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

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

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

person guerda    schedule 05.02.2009    source источник


Ответы (9)


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

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

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

person Techmaddy    schedule 05.02.2009
comment
Упс... ладно, понял. Таблица с ~600 записями, 10-значное число в качестве поля сравнения: Equal в 20-30 раз быстрее! - person guerda; 05.02.2009

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

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

Примеры совпадений:

TestUser1
TestUser2
TestU
Тест

person soulmerge    schedule 05.02.2009

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

"=" для точных совпадений.

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

person Stu Andrews    schedule 05.02.2009
comment
= не чувствителен к регистру - person fanchyna; 14.04.2017

Есть еще пара трюков, которые Postgres предлагает для сопоставления строк (если это ваша БД):

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

select * from people where name ilike 'JOHN'

Спички:

  • Джон
  • Джон
  • ДЖОН

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

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

Спички:

  • Джон
  • Джонатон
  • Джонни
person Ceilingfish    schedule 05.02.2009
comment
Насколько мне известно, регулярное выражение и подобные ключевые слова имеют худшую производительность, чем '=' - person Ceilingfish; 06.02.2009
comment
Опечатка "ilike" на "нравится" - person Salah Alshaal; 28.06.2016

На заметку, оператор '=' дополняет строки пробелами в Transact-SQL. Итак, 'abc' = 'abc ' вернет true; 'abc' LIKE 'abc ' вернет false. В большинстве случаев '=' будет правильным, но в моем недавнем случае это было не так.

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

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

person Philip H    schedule 23.04.2014

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

person Techmaddy    schedule 05.02.2009

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

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

person mmx    schedule 05.02.2009

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

person Gishu    schedule 05.02.2009

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

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

если @transid != 0

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

person Uniotter    schedule 14.07.2012