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

UPDATE ตัดข้อความก่อน Slash ใน VARCHAR Column MySQL

ฟังก์ชัน SUBSTRING_INDEX()

SUBSTRING_INDEX(str, delimiter, count)

  • count > 0: ส่วนก่อน Delimiter ครั้งที่ count
  • count < 0: ส่วนหลัง Delimiter ครั้งที่ |count|

ตัวอย่าง: ตาราง demo69

CREATE TABLE demo69 (name VARCHAR(40));

INSERT INTO demo69 VALUES
('John/Smith'), ('David/Miller'), ('Chris/Brown'), ('Carol/Taylor');

ข้อมูลก่อน UPDATE

+--------------+
| name         |
+--------------+
| John/Smith   |
| David/Miller |
| Chris/Brown  |
| Carol/Taylor |
+--------------+

คำสั่ง UPDATE: เก็บเฉพาะส่วนก่อน /

UPDATE demo69
SET name = SUBSTRING_INDEX(name, '/', 1);

ผลลัพธ์หลัง UPDATE

+-------+
| name  |
+-------+
| John  |
| David |
| Chris |
| Carol |
+-------+

รายละเอียด SUBSTRING_INDEX

CountInputDelimiterResult
1'a/b/c''/''a'
2'a/b/c''/''a/b'
-1'a/b/c''/''c'
-2'a/b/c''/''b/c'

กรณีศึกษาเพิ่มเติม

1. เก็บส่วนหลัง / (Last Name)

UPDATE demo69 SET name = SUBSTRING_INDEX(name, '/', -1);

2. Delimiter หลายตัวอักษร

SUBSTRING_INDEX('John::Smith', '::', 1)  -- 'John'

3. ใช้ใน SELECT (ไม่ UPDATE)

SELECT 
    SUBSTRING_INDEX(name, '/', 1) AS first_name,
    SUBSTRING_INDEX(name, '/', -1) AS last_name
FROM demo69;

4. จัดการ NULL และไม่มี Delimiter

SELECT 
    COALESCE(NULLIF(SUBSTRING_INDEX(name, '/', 1), ''), name) AS first_name
FROM demo69;

ประสิทธิภาพ

  • SUBSTRING_INDEX ใช้ Full Table Scan (ไม่ใช้ INDEX)
  • ตารางใหญ่: ควร Split คอลัมน์ออกมาเป็น first_name, last_name แยกกัน
  • หรือใช้ Generated Column + Index (MySQL 5.7+)

ฟังก์ชัน String อื่นที่เกี่ยวข้อง

ฟังก์ชันใช้สำหรับ
SUBSTRING(str, pos, len)ตัดตำแหน่งคงที่
SUBSTRING_INDEX(str, delim, count)ตัดด้วย Delimiter (แนะนำ)
LEFT(str, len)ตัวอักษรซ้าย n ตัว
RIGHT(str, len)ตัวอักษรขวา n ตัว
TRIM(str)ตัด Space หน้า/หลัง