การตัดข้อความหลังจุลภาคตัวสุดท้ายด้วย 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;