การลบแถวที่มีสตริงเฉพาะ (เช่น "foo") ในคอลัมน์ข้อความ สามารถทำได้ด้วยคำสั่ง DELETE ร่วมกับ LIKE และ wildcard %
รูปแบบคำสั่ง
DELETE FROM table_name
WHERE column_name LIKE '%search_string%';
%- ตรงกับตัวอักษร 0 หรือมากกว่า (ทุกตำแหน่ง)%foo%- มี "foo" อยู่ที่ไหนก็ได้ในสตริงfoo%- เริ่มต้นด้วย "foo"%foo- จบด้วย "foo"
ตัวอย่างการใช้งาน
1. สร้างตาราง bar และเพิ่มข้อมูล
CREATE TABLE bar (
Id INT NOT NULL AUTO_INCREMENT,
Words LONGTEXT,
PRIMARY KEY (Id)
);
INSERT INTO bar (Words) VALUES
('Javafoo'),
('fooMySQL'),
('Introduction to foo C and C++'),
('Introduction to Node.js'),
('Introduction to Hibernate framework');
ข้อมูลในตาราง:
+----+-------------------------------------+
| Id | Words |
+----+-------------------------------------+
| 1 | Javafoo |
| 2 | fooMySQL |
| 3 | Introduction to foo C and C++ |
| 4 | Introduction to Node.js |
| 5 | Introduction to Hibernate framework |
+----+-------------------------------------+
2. ลบแถวที่มี "foo" อยู่ที่ไหนก็ได้
DELETE FROM bar
WHERE Words LIKE '%foo%';
ผลลัพธ์: Query OK, 3 rows affected
คำสั่งเดียวนี้ครอบคลุมทุกกรณี: %foo% = เริ่มต้นด้วย foo, จบด้วย foo, หรืออยู่กลาง
3. ตรวจสอบข้อมูลที่เหลือ
SELECT * FROM bar;
+----+-------------------------------------+
| Id | Words |
+----+-------------------------------------+
| 4 | Introduction to Node.js |
| 5 | Introduction to Hibernate framework |
+----+-------------------------------------+
กรณีต้องการเฉพาะบางตำแหน่ง
| เงื่อนไข | ความหมาย | ตัวอย่างตรง |
|---|---|---|
LIKE 'foo%' | เริ่มต้นด้วย foo | fooBar, foo123 |
LIKE '%foo' | จบด้วย foo | Barfoo, 123foo |
LIKE '%foo%' | มี foo อยู่ที่ไหนก็ได้ | foo, afoo, fooB, afooB |
LIKE 'foo' | เท่ากับ foo ทุกประการ | foo |
การลบแบบ Case-Sensitive
MySQL เริ่มต้นไม่ case-sensitive (foo = FOO = Foo) หากต้องการ case-sensitive:
DELETE FROM bar
WHERE Words LIKE BINARY '%foo%';
คำเตือน
- ทดสอบด้วย SELECT ก่อน DELETE:
SELECT * FROM bar WHERE Words LIKE '%foo%'; - Backup ข้อมูล ก่อนลบจำนวนมาก
- พิจารณา
TRUNCATEหากต้องการลบทั้งตาราง (เร็วกว่า แต่อาจไม่ rollback ได้)