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

นับจำนวนค่าที่คั่นด้วยจุลภาคใน MySQL

การนับจำนวนรายการในสตริงที่คั่นด้วยจุลภาค

ใช้ 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