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

ดึงค่าสุดท้ายจาก Comma-Separated String ใน MySQL ด้วย SUBSTRING_INDEX

SUBSTRING_INDEX: ดึงส่วนท้ายหลัง Delimiter สุดท้าย

ฟังก์ชัน SUBSTRING_INDEX(str, delim, count) เมื่อ count < 0 จะคืน substring หลัง Delimiter ตัวที่ |count| นับจากขวา → ใช้ดึงค่าสุดท้ายของ CSV ได้

สร้างตารางและข้อมูล (Comma-Separated Values)

mysql> CREATE TABLE DemoTable1525 (ListOfSubjects TEXT);
Query OK, 0 rows affected (1.13 sec)

mysql> INSERT INTO DemoTable1525 VALUES
    -> ('MongoDB,C'), ('Java,C++,MySQL'), ('Python,C++,C,Java');
Query OK, 3 rows affected

ข้อมูลทั้งหมด

+-------------------+
| ListOfSubjects    |
+-------------------+
| MongoDB,C         |
| Java,C++,MySQL    |
| Python,C++,C,Java |
+-------------------+

คำสั่ง: ดึงค่าสุดท้าย (หลัง Comma ตัวสุดท้าย)

mysql> SELECT SUBSTRING_INDEX(ListOfSubjects, ',', -1) AS LastValue
    -> FROM DemoTable1525;

ผลลัพธ์

+-----------+
| LastValue |
+-----------+
| C         |
| MySQL     |
| Java      |
+-----------+

คำอธิบาย SUBSTRING_INDEX(str, ',', -1)

ListOfSubjectsComma PositionsCount=-1 (หลัง Comma ตัวสุดท้าย)
MongoDB,C1 CommaC
Java,C++,MySQL2 CommasMySQL
Python,C++,C,Java3 CommasJava

ดึงค่าแรก (Count = 1)

SELECT SUBSTRING_INDEX(ListOfSubjects, ',', 1) AS FirstValue
FROM DemoTable1525;
+-------------+
| FirstValue  |
+-------------+
| MongoDB     |
| Java        |
| Python      |
+-------------+

ดึงค่าที่ N (เช่น ตัวที่ 2)

-- ตัวที่ 2: SUBSTRING_INDEX(SUBSTRING_INDEX(str, ',', 2), ',', -1)
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(ListOfSubjects, ',', 2), ',', -1) AS SecondValue
FROM DemoTable1525;

MySQL 8.0: ใช้ JSON_TABLE (ถ้าเก็บเป็น JSON Array)

-- หากเก็บเป็น JSON: '["MongoDB", "C"]'
SELECT jt.val FROM DemoTable1525, 
JSON_TABLE(ListOfSubjects, '$[*]' COLUMNS (val VARCHAR(50) PATH '$')) AS jt;

⚠️ ข้อควรระวัง

  • ทำงานกับ String ธรรมดา ไม่ Parse CSV จริง (ไม่จัดการ Quoted Comma, Escaped Quote)
  • หากข้อมูลมี Comma ในค่า (เช่น 'A,B', 'C') จะนับผิด → ควรเก็บเป็น JSON Array หรือ Normalized Table
  • Performance: SUBSTRING_INDEX เร็วกว่า REGEXP/LOCATE Loop