Використовуйте '=' або LIKE для порівняння рядків у SQL?


169

Існує (майже релігійна) дискусія, якщо вам слід скористатися LIKE або '=' для порівняння рядків у операторах SQL.

  • Чи є причини використовувати LIKE?
  • Чи є причини використовувати "="?
  • Продуктивність? Читання?

Відповіді:


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

Порівнювати рядки з '=' набагато швидше.


5
Вуп ... добре, я взяв справу. Таблиця з ~ 600 записами, 10-цифрним числом у порівнянні з полем: Рівне 20 - 30 разів швидше!
guerda

194

LIKEі оператор рівності має різні цілі, вони не роблять одне і те ж:
=набагато швидше, тоді як LIKEможуть тлумачити підстановки. Використовуйте, =де можна і LIKEде потрібно.

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

Зразок відповідності:

TestUser1
TestUser2
TestU
Test



14

Є кілька інших хитрощів, які Postgres пропонує для відповідності рядків (якщо це трапляється у вашій БД):

ILIKE - це невідчутлива до випадку відповідність LIKE:

select * from people where name ilike 'JOHN'

Матчі:

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

І якщо ви хочете зійти з розуму, ви можете використовувати регулярні вирази:

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

Матчі:

  • Джон
  • Джонатон
  • Джонні

1
Наскільки мені відомо, регулярний вираз і подібні ключові слова мають гіршу ефективність, ніж '='
Ceilingfish

Одрукувати 'ilike' to 'like'
Салах Алшаал

9

Подібно до заголовків, оператор '=' буде розміщувати рядки з пробілами в Transact-SQL. Так 'abc' = 'abc 'повернеться правдою; 'abc' LIKE 'abc 'повернеться помилковим. У більшості випадків "=" буде правильним, але в останньому моєму випадку це не було.

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

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


7

Для відповідності шаблону використовуйте LIKE. Для точної відповідності =.


6

LIKEвикористовується для узгодження шаблону і =використовується для тесту на рівність (як визначено COLLATIONу використанні).

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


4

LIKE відповідає збігу як символи підстановки "[*,?] В оболонці
LIKE"% суфікс "- дайте мені все, що закінчується суфіксом. Ви не могли цього зробити з =
Залежить від конкретного випадку.


3

Існує ще одна причина використання "like", навіть якщо продуктивність повільніша: значення символів неявно перетворюються на цілі числа в порівнянні, так що:

оголосити @transid varchar (15)

якщо @transid! = 0

дасть вам помилку "Перетворення значення varchar" 123456789012345 "переповнено колонку int".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.