เมื่อมีคอลัมน์เก็บค่าหลายค่าคั่นด้วยจุลภาค (Comma-Separated Values) การนับจำนวนจุลภาคจะช่วยทราบจำนวนรายการ (จำนวนรายการ = จำนวนจุลภาค + 1) สามารถคำนวณได้โดยเปรียบเทียบความยาวสตริงก่อนและหลังลบจุลภาคออก
หลักการคำนวณ
จำนวนจุลภาค = LENGTH(สตริงต้นฉบับ) - LENGTH(REPLACE(สตริงต้นฉบับ, ',', ''))
ตัวอย่างการใช้งาน
สร้างตารางและเพิ่มข้อมูล:
mysql> CREATE TABLE DemoTable1510 (Value VARCHAR(50));
mysql> INSERT INTO DemoTable1510 VALUES ('20,35');
mysql> INSERT INTO DemoTable1510 VALUES ('45,67,89');
mysql> INSERT INTO DemoTable1510 VALUES ('90,97,101,190');
ดูข้อมูล:
mysql> SELECT * FROM DemoTable1510; +---------------+ | Value | +---------------+ | 20,35 | | 45,67,89 | | 90,97,101,190 | +---------------+
คำนวณจำนวนจุลภาค:
mysql> SELECT LENGTH(Value) - LENGTH(REPLACE(Value, ',', '')) AS NumberOfComma
-> FROM DemoTable1510;
ผลลัพธ์:
+---------------+ | NumberOfComma | +---------------+ | 1 | | 2 | | 3 | +---------------+
การประยุกต์ใช้: นับจำนวนรายการ
SELECT Value,
(LENGTH(Value) - LENGTH(REPLACE(Value, ',', '')) + 1) AS ItemCount
FROM DemoTable1510;
ผลลัพธ์: 2, 3, 4 รายการตามลำดับ
ข้อควรระวัง
- วิธีนี้ทำงานได้ก็ต่อเมื่อไม่มีจุลภาคซ้อนกัน (เช่น
1,,2) หรือจุลภาคนำหน้า/ท้าย (เช่น,1,2) - หากมีช่องว่างรอบจุลภาค (
1, 2, 3) ให้ลบช่องว่างก่อน:REPLACE(REPLACE(Value, ', ', ','), ' ', '') - สำหรับ MySQL 8.0+ สามารถใช้
JSON_LENGTHได้หากแปลงเป็น JSON Array ก่อน
แนวทางปฏิบัติที่ดีกว่า
หลีกเลี่ยงการเก็บค่าหลายค่าในคอลัมน์เดียว (Violates 1NF) ควร:
- สร้างตารางเชื่อมโยง (Junction Table) แทน
- ใช้ JSON Data Type (MySQL 5.7+) พร้อมฟังก์ชัน JSON_EXTRACT, JSON_LENGTH
- หากต้องเก็บเป็นข้อความ ให้ใช้ตัวคั่นที่ไม่ปรากฏในข้อมูล (เช่น | หรือ ||)