คำตอบของ Paul Dixon นั้นยอดเยี่ยมสำหรับฉัน เพื่อเพิ่มนี้นี่คือสิ่งที่ฉันสังเกตเห็นสำหรับผู้ที่สนใจในการใช้ REGEXP:
หากต้องการบรรลุตัวกรอง LIKE หลายรายการด้วย Wildcards:
SELECT * FROM fiberbox WHERE field LIKE '%1740 %'
OR field LIKE '%1938 %'
OR field LIKE '%1940 %';
ใช้ทางเลือก REGEXP:
SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 |1940 ';
ค่าภายในอัญประกาศ REGEXP และระหว่าง | (OR) ตัวดำเนินการจะถือว่าเป็นอักขระตัวแทน โดยทั่วไป REGEXP จะต้องการนิพจน์ตัวแทนเช่น (. *) 1740 (. *) เพื่อให้ทำงานเป็น% 1740%
หากคุณต้องการควบคุมตำแหน่งของ wildcard ให้ใช้ตัวแปรเหล่านี้บางส่วน:
หากต้องการบรรลุ LIKE ด้วยตำแหน่งไวด์การ์ดที่ควบคุม:
SELECT * FROM fiberbox WHERE field LIKE '1740 %'
OR field LIKE '%1938 '
OR field LIKE '%1940 % test';
ใช้:
SELECT * FROM fiberbox WHERE field REGEXP '^1740 |1938 $|1940 (.*) test';
การวาง ^ ด้านหน้าของค่าระบุว่าเป็นจุดเริ่มต้นของบรรทัด
วาง $ หลังจากค่าระบุจุดสิ้นสุดของบรรทัด
การวาง (. *) ทำตัวเหมือนสัญลักษณ์ตัวแทน%
ส่วน บ่งชี้อักขระเดี่ยวใด ๆ ยกเว้นตัวแบ่งบรรทัด การวาง ข้างใน () ด้วย * (. *) เพิ่มรูปแบบการทำซ้ำเพื่อระบุจำนวนอักขระจนถึงจุดสิ้นสุดบรรทัด
มีวิธีที่มีประสิทธิภาพมากขึ้นในการ จำกัด การจับคู่ที่เฉพาะเจาะจง แต่ต้องมีการตรวจสอบนิพจน์ปกติเพิ่มเติม หมายเหตุ: รูปแบบ regex บางรูปแบบอาจไม่ทำงานในคำสั่ง MySQL คุณจะต้องทดสอบรูปแบบของคุณและดูว่าอะไรทำงาน
สุดท้ายเพื่อบรรลุตัวกรอง LIKE หลายอันและไม่ชอบ LIKE:
SELECT * FROM fiberbox WHERE field LIKE '%1740 %'
OR field LIKE '%1938 %'
OR field NOT LIKE '%1940 %'
OR field NOT LIKE 'test %'
OR field = '9999';
ใช้ทางเลือก REGEXP:
SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 |^9999$'
OR field NOT REGEXP '1940 |^test ';
หรือทางเลือกผสม:
SELECT * FROM fiberbox WHERE field REGEXP '1740 |1938 '
OR field NOT REGEXP '1940 |^test '
OR field NOT LIKE 'test %'
OR field = '9999';
แจ้งให้ทราบฉันแยกไม่ได้ตั้งค่าในตัวกรองแยกที่ ฉันทดลองกับการใช้รูปแบบการปฏิเสธรูปแบบการมองไปข้างหน้าและอื่น ๆ อย่างไรก็ตามนิพจน์เหล่านี้ไม่ได้ให้ผลลัพธ์ตามที่ต้องการ ในตัวอย่างแรกข้างต้นฉันใช้ ^ 9999 $ เพื่อระบุการจับคู่ที่ตรงกัน สิ่งนี้ช่วยให้คุณสามารถเพิ่มการจับคู่ที่เฉพาะเจาะจงด้วยการจับคู่ตัวแทนในการแสดงออกเดียวกัน อย่างไรก็ตามคุณยังสามารถผสมคำสั่งประเภทนี้ตามที่คุณเห็นในตัวอย่างที่สองที่แสดง
เกี่ยวกับประสิทธิภาพฉันทำการทดสอบเล็กน้อยกับตารางที่มีอยู่และไม่พบความแตกต่างระหว่างรูปแบบของฉัน อย่างไรก็ตามฉันคิดว่าประสิทธิภาพอาจมีปัญหากับฐานข้อมูลที่ใหญ่กว่าฟิลด์ที่ใหญ่กว่าจำนวนการบันทึกที่มากขึ้นและตัวกรองที่ซับซ้อนยิ่งขึ้น
เช่นเคยใช้ตรรกะข้างต้นตามที่เหมาะสม
หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับนิพจน์ทั่วไปฉันขอแนะนำ www.regular-expressions.info เป็นเว็บไซต์อ้างอิงที่ดี
WHERE FIND_IN_SET(f.fiberbox, "1740,1938,1940")