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

MySQL: ค้นหาข้อความระหว่างตัวคั่น (Delimiter) ด้วย LOCATE และ SUBSTR

เมื่อต้องการดึงข้อความที่อยู่ระหว่างตัวคั่น (delimiter) ใน MySQL สามารถใช้ฟังก์ชัน LOCATE() ร่วมกับ SUBSTR() (หรือ SUBSTRING()) ได้ โดยตัวอย่างนี้ใช้เครื่องหมายทวิภาค : เป็นตัวคั่น

รูปแบบคำสั่ง

SELECT SUBSTR(
    your_column,
    LOCATE(':', your_column) + 1,
    (CHAR_LENGTH(your_column) - LOCATE(':', REVERSE(your_column)) - LOCATE(':', your_column))
) AS alias_name
FROM your_table;

คำอธิบาย:

  • LOCATE(':', your_column) - หาตำแหน่งตัวคั่นแรก
  • LOCATE(':', REVERSE(your_column)) - หาตำแหน่งตัวคั่นสุดท้าย (โดยกลับสตริงก่อน)
  • CHAR_LENGTH(...) - คำนวณความยาวสตริงทั้งหมด
  • สูตรคำนวณความยาว: ความยาวทั้งหมด - ตำแหน่งตัวคั่นสุดท้าย - ตำแหน่งตัวคั่นแรก

ตัวอย่างการใช้งาน

สร้างตารางและเพิ่มข้อมูล:

CREATE TABLE SearchTextBetweenDelimitersDemo (
    Id INT NOT NULL AUTO_INCREMENT,
    Words LONGTEXT,
    PRIMARY KEY (Id)
);

INSERT INTO SearchTextBetweenDelimitersDemo (Words) VALUES
('Object:Oriented:Programming'),
('C++:Java:C#'),
('SQLServer:MySQL:Oracle'),
('SQL SQLServer:MySQL:Oracle');

ข้อมูลในตาราง:

+----+-----------------------------+
| Id | Words                       |
+----+-----------------------------+
|  1 | Object:Oriented:Programming |
|  2 | C++:Java:C#                 |
|  3 | SQLServer:MySQL:Oracle      |
|  4 | SQL SQLServer:MySQL:Oracle  |
+----+-----------------------------+

คำสั่งดึงข้อความระหว่างตัวคั่นแรกและตัวคั่นสุดท้าย

SELECT SUBSTR(
    Words,
    LOCATE(':', Words) + 1,
    (CHAR_LENGTH(Words) - LOCATE(':', REVERSE(Words)) - LOCATE(':', Words))
) AS Text
FROM SearchTextBetweenDelimitersDemo;

ผลลัพธ์:

+----------+
| Text     |
+----------+
| Oriented |
| Java     |
| MySQL    |
| MySQL    |
+----------+

หมายเหตุ: วิธีนี้ดึงข้อความ "ระหว่างตัวคั่นตัวแรกและตัวสุดท้าย" หากต้องการดึงส่วนที่ 2 เท่านั้น (เช่น Oriented, Java, MySQL) ให้ใช้ SUBSTRING_INDEX() แทนจะง่ายกว่า:

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(Words, ':', 2), ':', -1) AS Text
FROM SearchTextBetweenDelimitersDemo;