มีการสนทนา (เกือบทางศาสนา) หากคุณควรใช้ LIKE หรือ '=' เพื่อเปรียบเทียบสตริงในคำสั่ง SQL
- มีเหตุผลในการใช้ LIKE หรือไม่
- มีเหตุผลให้ใช้ '=' หรือไม่?
- ประสิทธิภาพ? การอ่าน?
มีการสนทนา (เกือบทางศาสนา) หากคุณควรใช้ LIKE หรือ '=' เพื่อเปรียบเทียบสตริงในคำสั่ง SQL
คำตอบ:
หากต้องการดูความแตกต่างด้านประสิทธิภาพให้ลองทำดังนี้:
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
การเปรียบเทียบสตริงด้วย '=' นั้นเร็วกว่ามาก
LIKE
และผู้ดำเนินการความเท่าเทียมกันมีวัตถุประสงค์ที่แตกต่างกันพวกเขาไม่ได้ทำสิ่งเดียวกัน:
=
เร็วกว่ามากในขณะที่LIKE
สามารถตีความสัญลักษณ์แทนได้ ใช้งานได้=
ทุกที่และLIKE
ทุกเวลาที่คุณต้องการ
SELECT * FROM user WHERE login LIKE 'Test%';
ตัวอย่างการแข่งขัน:
TestUser1
TestUser2
TestU
ทดสอบ
จากประสบการณ์เล็ก ๆ ของฉัน:
"=" สำหรับการจับคู่แบบตรงทั้งหมด
"LIKE" สำหรับการแข่งขันบางส่วน
มีเทคนิคอีกสองสามอย่างที่ Postgres เสนอสำหรับการจับคู่สตริง (หากเกิดขึ้นกับ DB ของคุณ):
ILIKE ซึ่งตรงกับ LIKE ที่ไม่สำคัญ:
select * from people where name ilike 'JOHN'
ตรงกัน:
และถ้าคุณต้องการโกรธจริงๆคุณสามารถใช้นิพจน์ทั่วไป
select * from people where name ~ 'John.*'
ตรงกัน:
ในฐานะที่เป็นหัวขึ้นผู้ประกอบการ '=' จะรองสตริงที่มีช่องว่างใน Transact-SQL ดังนั้น'abc' = 'abc '
จะกลับมาจริง 'abc' LIKE 'abc '
จะกลับเท็จ ในกรณีส่วนใหญ่ '=' จะถูกต้อง แต่ในกรณีล่าสุดของฉันมันไม่ถูกต้อง
ดังนั้นในขณะที่ '=' เร็วขึ้น LIKE อาจระบุความตั้งใจของคุณอย่างชัดเจนมากขึ้น
สำหรับการจับคู่รูปแบบให้ใช้ LIKE สำหรับการจับคู่ที่ตรงกัน =.
LIKE
ใช้สำหรับการจับคู่รูปแบบและ=
ใช้สำหรับการทดสอบความเท่าเทียมกัน (ตามที่กำหนดโดยการCOLLATION
ใช้งาน)
=
สามารถใช้ดัชนีในขณะที่LIKE
แบบสอบถามมักต้องการทดสอบทุก ๆ ระเบียนในชุดผลลัพธ์เพื่อกรองออก (เว้นแต่ว่าคุณใช้การค้นหาข้อความแบบเต็ม) ดังนั้นจึง=
มีประสิทธิภาพที่ดีกว่า
LIKE จับคู่เช่น wildcards อักขระถ่าน [*,?] ที่เชลล์
LIKE '% suffix' - ให้ทุกอย่างที่ลงท้ายด้วยคำต่อท้าย คุณไม่สามารถทำได้ด้วย =
ขึ้นอยู่กับกรณีและปัญหา
มีอีกเหตุผลสำหรับการใช้ "ชอบ" แม้ว่าประสิทธิภาพจะช้าลง: ค่าอักขระจะถูกแปลงเป็นจำนวนเต็มเมื่อเปรียบเทียบดังนั้น:
ประกาศ @transid varchar (15)
if @transid! = 0
จะให้ข้อผิดพลาด "การแปลงค่า varchar '123456789012345' คอลัมน์ int ล้น" ข้อผิดพลาด