'=' Veya LIKE SQL dizeleri karşılaştırmak için kullanın?


170

SQL deyimlerindeki dizeleri karşılaştırmak için LIKE veya '=' kullanmanız gerekiyorsa (neredeyse dini) bir tartışma vardır.

  • GİBİ kullanmak için nedenler var mı?
  • '=' Kullanmak için nedenler var mı?
  • Verim? Okunabilirlik?

Yanıtlar:


127

Performans farkını görmek için şunu deneyin:

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

Dizeleri '=' ile karşılaştırmak çok daha hızlıdır.


5
Woops ... tamam, anladım. ~ 600 girişli tablo, karşılaştırma alanı olarak 10 haneli sayı: Eşit 20 ila 30 kat daha hızlı!
guerda

194

LIKEve eşitlik operatörünün farklı amaçları vardır, aynı şeyi yapmazlar:
=çok daha hızlıdır, oysa LIKEjoker karakterleri yorumlayabilir. Mümkün olan =her yerde ve LIKEgerektiğinde kullanın.

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

Örnek eşleşmeler:

TestUser1
TestUser2
TestU
Testi


37

Benim küçük deneyimime göre:

Tam Eşleşmeler için "=".

Kısmi Eşleşmeler için "GİBİ".


5
= büyük / küçük harfe duyarlı değildir
fanchyna

14

Postgres'in dize eşleşmesi için sunduğu birkaç başka numara var (eğer DB'niz bu ise):

Büyük / küçük harfe duyarlı olmayan bir LIKE eşleşmesi olan ILIKE:

select * from people where name ilike 'JOHN'

Maçlar:

  • John
  • John
  • JOHN

Ve eğer gerçekten kızmak istiyorsanız düzenli ifadeler kullanabilirsiniz:

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

Maçlar:

  • John
  • Johnathon
  • Johnny

1
Bildiğim kadarıyla normal ifade ve benzeri anahtar kelimeler '=' daha kötü performansa sahip
Ceilingfish

'
Ilike

9

Tıpkı bir uyarı gibi, '=' operatörü, Transact-SQL'de boşluklu dizeleri doldurur. Böylece 'abc' = 'abc 'doğru dönecektir; 'abc' LIKE 'abc 'yanlış döndürür. Çoğu durumda '=' doğru olacaktır, ancak son zamanlarda yaptığım bir durum doğru değildi.

Dolayısıyla '=' daha hızlı olsa da, LIKE niyetlerinizi daha açık bir şekilde ifade edebilir.

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


7

Kalıp eşleşmesi için LIKE kullanın. Tam eşleşme için =.


6

LIKEörüntü eşleştirme =için kullanılır ve eşitlik testi için kullanılır ( COLLATIONkullanımda tanımlandığı gibi ).

=ise endeksler kullanabilirsiniz LIKEsorguları genellikle (tam metin araması kullanmıyorsanız) öyle filtrelemek için sonuç kümesindeki her bir kaydı test gerektiren =daha iyi performansa sahiptir.


4

LIKE,
'% soneki' LIKE kabuğundaki joker karakterlerle [*,?] Eşleşiyor - bana sonekle biten her şeyi ver. Bunu = ile yapamazsınız
Aslında duruma bağlıdır.


3

Performans daha yavaş olsa bile "like" kullanmanın başka bir nedeni daha vardır: Karakter değerleri karşılaştırıldığında örtük olarak tamsayıya dönüştürülür, bu nedenle:

@transid varchar (15) tarafından beyan edildi

eğer @transid! = 0

"varchar değerinin" 123456789012345 "dönüşümü int sütunundan taştı" hatası verir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.