Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

วิธีเลือกแถวเฉพาะใน MySQL ด้วย FIND_IN_SET()

การค้นหาค่าในสตริงที่คั่นด้วยจุลภาค (Comma-Separated Values)

เมื่อข้อมูลเก็บอยู่ในรูปแบบรายการคั่นด้วยจุลภาค (CSV) ในคอลัมน์เดียว เช่น '112,114,567,Java,345' สามารถใช้ฟังก์ชัน FIND_IN_SET() เพื่อค้นหาแถวที่มีค่าที่ต้องการอยู่ในรายการนั้นๆ ได้

ตัวอย่างสร้างตารางและข้อมูล

CREATE TABLE DemoTable (
    ListOfValues VARCHAR(200)
);

เพิ่มข้อมูล:

INSERT INTO DemoTable VALUES 
('112,114,567,Java,345'),
('222,214,256'),
('2,567,98,C');

ข้อมูลในตาราง

+----------------------+
| ListOfValues         |
+----------------------+
| 112,114,567,Java,345 |
| 222,214,256          |
| 2,567,98,C           |
+----------------------+

คำสั่งค้นหาแถวที่มีค่า '2' อยู่ในรายการ

SELECT * FROM DemoTable 
WHERE FIND_IN_SET('2', ListOfValues) > 0;

ผลลัพธ์

+--------------+
| ListOfValues |
+--------------+
| 2,567,98,C   |
+--------------+

คำอธิบาย: FIND_IN_SET('2', ListOfValues) จะคืนค่าตำแหน่ง (1-based index) ของค่า '2' ในสตริง ListOfValues หากพบ จะคืนค่า > 0 หากไม่พบคืนค่า 0

⚠ ข้อจำกัดและคำเตือน:

  • FIND_IN_SET() ทำงานได้เฉพาะเมื่อค่าคั่นด้วยจุลภาค (,) เท่านั้น ไม่รองรับตัวคั่นอื่น
  • ไม่สามารถใช้ดัชนี (Index) ได้ ทำให้ช้าบนตารางขนาดใหญ่
  • ออกแบบฐานข้อมูลที่ดีควรแยกค่าออกเป็นตารางความสัมพันธ์ (Normalization) แทนการเก็บ CSV ในคอลัมน์เดียว
  • MySQL 8.0+ แนะนำให้ใช้ JSON_CONTAINS() กับชนิดข้อมูล JSON แทน