ใช้ '=' หรือ 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
ทดสอบ



14

มีเทคนิคอีกสองสามอย่างที่ Postgres เสนอสำหรับการจับคู่สตริง (หากเกิดขึ้นกับ DB ของคุณ):

ILIKE ซึ่งตรงกับ LIKE ที่ไม่สำคัญ:

select * from people where name ilike 'JOHN'

ตรงกัน:

  • จอห์น
  • จอห์น
  • จอห์น

และถ้าคุณต้องการโกรธจริงๆคุณสามารถใช้นิพจน์ทั่วไป

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

ตรงกัน:

  • จอห์น
  • Johnathon
  • จอห์นนี่

1
เท่าที่ผมทราบการแสดงออกปกติและเช่นเดียวกับคำหลักที่มีประสิทธิภาพการทำงานที่เลวร้ายยิ่งกว่า '='
Ceilingfish

Typo 'ilike' เป็น 'like'
Salah Alshaal

9

ในฐานะที่เป็นหัวขึ้นผู้ประกอบการ '=' จะรองสตริงที่มีช่องว่างใน Transact-SQL ดังนั้น'abc' = 'abc 'จะกลับมาจริง 'abc' LIKE 'abc 'จะกลับเท็จ ในกรณีส่วนใหญ่ '=' จะถูกต้อง แต่ในกรณีล่าสุดของฉันมันไม่ถูกต้อง

ดังนั้นในขณะที่ '=' เร็วขึ้น LIKE อาจระบุความตั้งใจของคุณอย่างชัดเจนมากขึ้น

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


7

สำหรับการจับคู่รูปแบบให้ใช้ LIKE สำหรับการจับคู่ที่ตรงกัน =.


6

LIKEใช้สำหรับการจับคู่รูปแบบและ=ใช้สำหรับการทดสอบความเท่าเทียมกัน (ตามที่กำหนดโดยการCOLLATIONใช้งาน)

=สามารถใช้ดัชนีในขณะที่LIKEแบบสอบถามมักต้องการทดสอบทุก ๆ ระเบียนในชุดผลลัพธ์เพื่อกรองออก (เว้นแต่ว่าคุณใช้การค้นหาข้อความแบบเต็ม) ดังนั้นจึง=มีประสิทธิภาพที่ดีกว่า


4

LIKE จับคู่เช่น wildcards อักขระถ่าน [*,?] ที่เชลล์
LIKE '% suffix' - ให้ทุกอย่างที่ลงท้ายด้วยคำต่อท้าย คุณไม่สามารถทำได้ด้วย =
ขึ้นอยู่กับกรณีและปัญหา


3

มีอีกเหตุผลสำหรับการใช้ "ชอบ" แม้ว่าประสิทธิภาพจะช้าลง: ค่าอักขระจะถูกแปลงเป็นจำนวนเต็มเมื่อเปรียบเทียบดังนั้น:

ประกาศ @transid varchar (15)

if @transid! = 0

จะให้ข้อผิดพลาด "การแปลงค่า varchar '123456789012345' คอลัมน์ int ล้น" ข้อผิดพลาด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.