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

ลบข้อความหลังเครื่องหมายจุลภาคตัวสุดท้ายใน MySQL

การตัดข้อความหลังจุลภาคตัวสุดท้ายด้วย SUBSTRING_INDEX

ใช้ SUBSTRING_INDEX() ร่วมกับการคำนวณจำนวนจุลภาค เพื่อตัดข้อความหลังจุลภาคตัวสุดท้ายแบบไดนามิก

ไวยากรณ์

UPDATE yourTableName 
SET yourColumnName = SUBSTRING_INDEX(
    yourColumnName, 
    ',', 
    LENGTH(yourColumnName) - LENGTH(REPLACE(yourColumnName, ',', ''))
);

การทำงานของสูตร

  • LENGTH(col) - LENGTH(REPLACE(col, ',', '')) = จำนวนจุลภาคในสตริง
  • SUBSTRING_INDEX(str, ',', count) = ดึงส่วนก่อนจุลภาคตัวที่ count
  • รวมกัน = ดึงข้อความตั้งแต่ต้นจนถึงจุลภาคตัวสุดท้าย (ไม่รวมส่วนหลังจุลภาคสุดท้าย)

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

สร้างตาราง:

CREATE TABLE RemoveAllCharacters (
    Id INT NOT NULL AUTO_INCREMENT,
    FullInfo VARCHAR(200),
    PRIMARY KEY(Id)
);

เพิ่มข้อมูล:

INSERT INTO RemoveAllCharacters(FullInfo) VALUES('John,Smith,23,98,4565886');
INSERT INTO RemoveAllCharacters(FullInfo) VALUES('Carol,Taylor,26,91');
INSERT INTO RemoveAllCharacters(FullInfo) VALUES('David,Miller,21');
INSERT INTO RemoveAllCharacters(FullInfo) VALUES('Robert,Jones,22,97');
INSERT INTO RemoveAllCharacters(FullInfo) VALUES('Sam,Williams,27,88,456788,97877');

อัปเดตตัดท้ายจุลภาคสุดท้าย:

UPDATE RemoveAllCharacters 
SET FullInfo = SUBSTRING_INDEX(
    FullInfo, 
    ',', 
    LENGTH(FullInfo) - LENGTH(REPLACE(FullInfo, ',', ''))
);

ผลลัพธ์:

+----+---------------------------+
| Id | FullInfo                  |
+----+---------------------------+
| 1  | John,Smith,23,98          |
| 2  | Carol,Taylor,26           |
| 3  | David,Miller              |
| 4  | Robert,Jones,22           |
| 5  | Sam,Williams,27,88,456788 |
+----+---------------------------+

กรณีพิเศษ: มีจุลภาคเพียง 1 ตัว หรือ ไม่มีจุลภาค

  • 1 จุลภาค: จะคืนค่าส่วนก่อนจุลภาค (เหลือแค่ส่วนแรก)
  • ไม่มีจุลภาค: สูตรจะได้ 0 -> SUBSTRING_INDEX คืนค่า empty string
  • แก้ไขได้โดยเพิ่มเงื่อนไข: CASE WHEN ... THEN ... ELSE FullInfo END

วิธีเลือก (SELECT) แทน UPDATE

SELECT Id, 
       SUBSTRING_INDEX(FullInfo, ',', 
           LENGTH(FullInfo) - LENGTH(REPLACE(FullInfo, ',', ''))
       ) AS TrimmedInfo
FROM RemoveAllCharacters;