MySQL ไม่มีฟังก์ชัน LAST_INDEX_OF() ตรงๆ แต่สามารถหาตำแหน่ง Substring สุดท้ายได้โดย **กลับสตริง (REVERSE) แล้วหาตำแหน่งแรก (LOCATE)**
หลักการคำนวณ
Position = CHAR_LENGTH(str) - LOCATE('delimiter', REVERSE(str)) + 1
รูปแบบคำสั่ง
SELECT CHAR_LENGTH(yourColumn) - LOCATE('delimiter', REVERSE(yourColumn)) + 1
AS last_pos FROM yourTable;
ตัวอย่าง: หาตำแหน่ง Space สุดท้าย (คำสุดท้าย)
1. สร้างตารางและเพิ่มข้อความ
mysql> CREATE TABLE SubStringIndexDemo (Words VARCHAR(200));
Query OK, 0 rows affected (0.57 sec)
mysql> INSERT INTO SubStringIndexDemo VALUES
-> ('This is MySQL Query'),
-> ('MySQL is a Relational Database'),
-> ('Java is a programming language'),
-> ('Spring is a Framework');
2. ดูข้อมูล
mysql> SELECT * FROM SubStringIndexDemo;
+--------------------------------+
| Words |
+--------------------------------+
| This is MySQL Query |
| MySQL is a Relational Database |
| Java is a programming language |
| Spring is a Framework |
+--------------------------------+
4 rows in set (0.00 sec)
3. หาตำแหน่ง Space สุดท้าย
mysql> SELECT CHAR_LENGTH(Words) - LOCATE(' ', REVERSE(Words)) + 1
-> AS PositionOfLastSubstring
-> FROM SubStringIndexDemo;
+-------------------------+
| PositionOfLastSubstring |
+-------------------------+
| 14 | -- "Query" เริ่มที่ 14
| 22 | -- "Database" เริ่มที่ 22
| 22 | -- "language" เริ่มที่ 22
| 12 | -- "Framework" เริ่มที่ 12
+-------------------------+
4 rows in set (0.00 sec)
การตรวจสอบ: ดึงคำสุดท้ายออกมา
SELECT
Words,
CHAR_LENGTH(Words) - LOCATE(' ', REVERSE(Words)) + 1 AS pos,
SUBSTRING(Words, CHAR_LENGTH(Words) - LOCATE(' ', REVERSE(Words)) + 2) AS last_word
FROM SubStringIndexDemo;
+--------------------------------+------+-----------+
| Words | pos | last_word |
+--------------------------------+------+-----------+
| This is MySQL Query | 14 | Query |
| MySQL is a Relational Database | 22 | Database |
| Java is a programming language | 22 | language |
| Spring is a Framework | 12 | Framework |
+--------------------------------+------+-----------+
4 rows in set (0.00 sec)
ฟังก์ชันที่เกี่ยวข้อง
| ฟังก์ชัน | คำอธิบาย |
|---|---|
LOCATE(substr, str, [pos]) | หาตำแหน่งแรกของ substr ใน str (1-based) |
INSTR(str, substr) | เหมือน LOCATE แต่สลับอาร์กิวเมนต์ |
POSITION(substr IN str) | ANSI SQL Syntax |
REVERSE(str) | กลับลำดับตัวอักษร |
CHAR_LENGTH(str) | ความยาวเป็นจำนวน Character (Multi-byte safe) |
LENGTH(str) | ความยาวเป็น Byte |
SUBSTRING(str, pos, len) | ตัดสตริง |
SUBSTRING_INDEX(str, delim, count) | ตัดด้วย Delimiter (ง่ายกว่าสำหรับคำสุดท้าย) |
วิธีง่ายกว่า: SUBSTRING_INDEX
-- คำสุดท้าย (Delimiter = Space)
SELECT SUBSTRING_INDEX(Words, ' ', -1) AS last_word FROM SubStringIndexDemo;
-- ทุกอย่างหลัง Space สุดท้าย
SELECT SUBSTRING_INDEX(Words, ' ', -1) FROM SubStringIndexDemo;
+-----------+
| last_word |
+-----------+
| Query |
| Database |
| language |
| Framework |
+-----------+
4 rows in set (0.00 sec)
แนะนำ: ใช้ SUBSTRING_INDEX(str, delim, -1) สำหรับหาส่วนท้ายคั่นด้วย Delimiter - สั้นกว่า อ่านง่ายกว่า ประสิทธิภาพดีกว่า
กรณีไม่มี Delimiter (Single Word)
SELECT
Words,
CASE
WHEN LOCATE(' ', Words) = 0 THEN 1
ELSE CHAR_LENGTH(Words) - LOCATE(' ', REVERSE(Words)) + 2
END AS last_word_start
FROM SubStringIndexDemo;