Gunakan '=' atau LIKE untuk membandingkan string dalam SQL?

169

Ada diskusi (hampir religius), jika Anda harus menggunakan LIKE atau '=' untuk membandingkan string dalam pernyataan SQL.

  • Apakah ada alasan untuk menggunakan LIKE?
  • Apakah ada alasan untuk menggunakan '='?
  • Performa? Keterbacaan?
guerda
sumber

Jawaban:

126

Untuk melihat perbedaan kinerja, coba ini:

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

Membandingkan string dengan '=' jauh lebih cepat.

Techmaddy
sumber
5
Aduh ... oke, saya ambil intinya. Tabel dengan ~ 600 entri, 10 digit angka sebagai bidang pembanding: Sama dengan 20 hingga 30 kali lebih cepat!
guerda
194

LIKEdan operator kesetaraan memiliki tujuan yang berbeda, mereka tidak melakukan hal yang sama:
=jauh lebih cepat, sedangkan LIKEdapat mengartikan wildcard. Gunakan di =mana pun Anda bisa dan di LIKEmana pun Anda harus.

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

Pertandingan sampel:

TestUser1
TestUser2
TestU
Test

soulmerge
sumber
37

Dalam pengalaman kecil saya:

"=" untuk Pencocokan Tepat.

"LIKE" untuk Pertandingan Parsial.

Stu Andrews
sumber
5
= tidak peka huruf besar-kecil
fanchyna
14

Ada beberapa trik lain yang ditawarkan Postgres untuk pencocokan string (jika itu adalah DB Anda):

ILIKE, yang merupakan kasus SEPERTI pertandingan yang tidak sensitif:

select * from people where name ilike 'JOHN'

Cocok:

  • John
  • john
  • JOHN

Dan jika Anda ingin benar-benar marah, Anda dapat menggunakan ekspresi reguler:

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

Cocok:

  • John
  • Johnathon
  • Johnny
Plafon ikan
sumber
1
Sejauh yang saya sadar ekspresi reguler dan seperti kata kunci memiliki kinerja yang lebih buruk daripada '='
Ceilingfish
Typo 'ilike' to 'like'
Salah Alshaal
9

Sama seperti kepala, operator '=' akan menambahkan string dengan spasi di Transact-SQL. Jadi 'abc' = 'abc 'akan kembali benar; 'abc' LIKE 'abc 'akan kembali salah. Dalam kebanyakan kasus '=' akan benar, tetapi dalam kasus saya baru-baru ini tidak.

Jadi sementara '=' lebih cepat, LIKE mungkin secara lebih eksplisit menyatakan niat Anda.

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

Philip H
sumber
7

Untuk pencocokan pola, gunakan LIKE. Untuk pencocokan tepat =.

Techmaddy
sumber
6

LIKEdigunakan untuk pencocokan pola dan =digunakan untuk uji kesetaraan (seperti yang didefinisikan oleh yang COLLATIONdigunakan).

=dapat menggunakan indeks sementara LIKEkueri biasanya memerlukan pengujian setiap rekaman tunggal dalam hasil yang ditetapkan untuk memfilternya (kecuali jika Anda menggunakan pencarian teks lengkap) sehingga =memiliki kinerja yang lebih baik.

Mehrdad Afshari
sumber
4

SUKA tidak cocok dengan karakter wildcard [*,?] Di shell
LIKE '% suffix' - beri saya semua yang berakhiran akhiran. Anda tidak bisa melakukannya dengan =
Tergantung pada case sebenarnya.

Gishu
sumber
3

Ada alasan lain untuk menggunakan "suka" walaupun kinerjanya lebih lambat: Nilai karakter secara implisit dikonversi menjadi bilangan bulat jika dibandingkan, jadi:

declare @transid varchar (15)

if @transid! = 0

akan memberi Anda kesalahan "Konversi nilai varchar '123456789012345' meluap kolom int".

Uniotter
sumber