Vấn đề
Cột lưu chuỗi như '120 Gigabytes', cần tách lấy phần số '120' (trước dấu cách đầu tiên).
Giải pháp: LEFT + INSTR
UPDATE DemoTable SET Download = LEFT(Download, INSTR(Download, ' ') - 1);
Ví dụ minh họa
Tạo bảng và chèn dữ liệu
mysql> CREATE TABLE DemoTable (
Download VARCHAR(100)
);
mysql> INSERT INTO DemoTable VALUES
('120 Gigabytes'), ('190 Gigabytes'), ('250 Gigabytes'), ('1000 Gigabytes');
Xem dữ liệu trước
mysql> SELECT * FROM DemoTable;
+----------------+ | Download | +----------------+ | 120 Gigabytes | | 190 Gigabytes | | 250 Gigabytes | | 1000 Gigabytes | +----------------+
Cập nhật xóa đơn vị
mysql> UPDATE DemoTable SET Download = LEFT(Download, INSTR(Download, ' ') - 1);
Query OK, 4 rows affected (0.16 sec)
Kết quả sau
mysql> SELECT * FROM DemoTable;
+----------+ | Download | +----------+ | 120 | | 190 | | 250 | | 1000 | +----------+
Giải thích hàm
INSTR(str, ' '): Trả về vị trí (1-based) của dấu cách đầu tiên. Ví dụ: '120 Gigabytes' → vị trí 4.LEFT(str, len): Lấylenký tự từ trái.LEFT(..., 4-1=3)→ '120'.
Cách thay thế khác
-- SUBSTRING_INDEX: Lấy phần trước dấu cách đầu UPDATE DemoTable SET Download = SUBSTRING_INDEX(Download, ' ', 1); -- REGEXP_REPLACE (MySQL 8.0+): Xóa từ dấu cách trở đi UPDATE DemoTable SET Download = REGEXP_REPLACE(Download, ' .*', ''); -- Chỉ SELECT (không UPDATE) SELECT SUBSTRING_INDEX(Download, ' ', 1) AS NumberPart FROM DemoTable;
⚠️ Lưu ý
- Nếu chuỗi **không có dấu cách**,
INSTRtrả về 0,LEFT(..., -1)trả về chuỗi rỗng. Cần xử lý:IF(INSTR(Download, ' ') > 0, LEFT(...), Download). - Dữ liệu gốc bị mất. Cân nhắc thêm cột mới hoặc backup.