การนับจำนวนรายการในสตริงที่คั่นด้วยจุลภาค
ใช้ CHAR_LENGTH() (หรือ LENGTH()) เปรียบเทียบความยาวก่อนและหลังลบจุลภาคออก เพื่อหาจำนวนจุลภาค แล้วบวก 1
ไวยากรณ์
SELECT *,
(CHAR_LENGTH(yourColumn) - CHAR_LENGTH(REPLACE(yourColumn, ',', '')) + 1) AS TotalCount
FROM yourTableName;
หลักการทำงาน
CHAR_LENGTH(col)- ความยาวสตริงต้นฉบับCHAR_LENGTH(REPLACE(col, ',', ''))- ความยาวหลังลบจุลภาคทั้งหมด- ความต่าง = จำนวนจุลภาค
- จำนวนรายการ = จำนวนจุลภาค + 1
ตัวอย่างการใช้งาน
สร้างตาราง:
CREATE TABLE CountValuesCommaSeparated (
Id INT NOT NULL AUTO_INCREMENT,
CommaSeparatedValue TEXT,
PRIMARY KEY(Id)
);
เพิ่มข้อมูล:
INSERT INTO CountValuesCommaSeparated(CommaSeparatedValue) VALUES('101,104,1900,46675,7895');
INSERT INTO CountValuesCommaSeparated(CommaSeparatedValue) VALUES('1010,18949,37465');
INSERT INTO CountValuesCommaSeparated(CommaSeparatedValue) VALUES('2010,1201,2743874,7485');
INSERT INTO CountValuesCommaSeparated(CommaSeparatedValue) VALUES('4757,457587,48586,378575,3874765,487565');
นับจำนวนค่า:
SELECT *,
(CHAR_LENGTH(CommaSeparatedValue) - CHAR_LENGTH(REPLACE(CommaSeparatedValue, ',', '')) + 1) AS TotalValue
FROM CountValuesCommaSeparated;
ผลลัพธ์:
+----+-----------------------------------------+------------+
| Id | CommaSeparatedValue | TotalValue |
+----+-----------------------------------------+------------+
| 1 | 101,104,1900,46675,7895 | 5 |
| 2 | 1010,18949,37465 | 3 |
| 3 | 2010,1201,2743874,7485 | 4 |
| 4 | 4757,457587,48586,378575,3874765,487565 | 6 |
+----+-----------------------------------------+------------+
ข้อจำกัดและกรณีพิเศษ
- สตริงว่าง ('') จะได้ 1 (ควรเป็น 0) -> ใช้
CASE WHEN col = '' THEN 0 ELSE ... END - มีช่องว่าง:
'a, b, c'นับได้ 3 (ถูกต้อง) - จุลภาคติดกัน:
'a,,b'นับได้ 3 (อาจไม่ถูกต้องตามเจตนา)
แก้ไขกรณีพิเศษ
SELECT *,
CASE
WHEN CommaSeparatedValue = '' THEN 0
WHEN CommaSeparatedValue IS NULL THEN NULL
ELSE CHAR_LENGTH(CommaSeparatedValue) - CHAR_LENGTH(REPLACE(CommaSeparatedValue, ',', '')) + 1
END AS TotalValue
FROM CountValuesCommaSeparated;
หมายเหตุ
การเก็บข้อมูลแบบ comma-separated ในคอลัมน์เดียวเป็น Anti-pattern (First Normal Form violation) ควรแยกเป็นตารางความสัมพันธ์ (Junction Table) แทนเพื่อ:
- Query ได้รวดเร็วด้วย Index
- Enforce Foreign Key
- หลีกเลี่ยง parsing complexity