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

หาตำแหน่ง Substring สุดท้ายใน MySQL ด้วย CHAR_LENGTH, LOCATE, REVERSE

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;