Vấn đề: Chia cột VARCHAR chứa số thực ('100.50') thành 2 cột: phần nguyên (100) và phần thập phân (50)
Giải pháp: SUBSTRING_INDEX + CAST
Dùng dấu chấm '.' làm delimiter. SUBSTRING_INDEX(str, delim, count) lấy phần trước/sau delimiter.
1. Tạo bảng và dữ liệu
CREATE TABLE DemoTable (Value1 VARCHAR(20));
INSERT INTO DemoTable VALUES ('100.50'), ('70.90'), ('1000.55');
2. Truy vấn tách
SELECT
CAST(SUBSTRING_INDEX(Value1, '.', 1) AS UNSIGNED) AS FirstValue,
CAST(SUBSTRING_INDEX(Value1, '.', -1) AS UNSIGNED) AS SecondValue
FROM DemoTable;
3. Giải thích
SUBSTRING_INDEX(Value1, '.', 1)– Phần TRƯỚC dấu chấm đầu tiên ('100', '70', '1000').SUBSTRING_INDEX(Value1, '.', -1)– Phần SAU dấu chấm cuối cùng ('50', '90', '55').CAST(... AS UNSIGNED)– Chuyển chuỗi thành số nguyên không dấu.
4. Kết quả
+------------+-------------+
| FirstValue | SecondValue |
+------------+-------------+
| 100 | 50 |
| 70 | 90 |
| 1000 | 55 |
+------------+-------------+
Xử lý trường hợp không có dấu chấm
SELECT
CAST(SUBSTRING_INDEX(Value1, '.', 1) AS UNSIGNED) AS FirstValue,
CAST(IF(LOCATE('.', Value1) > 0, SUBSTRING_INDEX(Value1, '.', -1), '0') AS UNSIGNED) AS SecondValue
FROM DemoTable;
Cách khác (MySQL 8.0+): REGEXP_SUBSTR
SELECT
CAST(REGEXP_SUBSTR(Value1, '^[^.]+') AS UNSIGNED) AS FirstValue,
CAST(REGEXP_SUBSTR(Value1, '[^.]+$') AS UNSIGNED) AS SecondValue
FROM DemoTable;
Lưu ý
- Dữ liệu gốc là VARCHAR – nếu là DECIMAL/FLOAT, dùng
FLOOR()vàcol - FLOOR(col). SUBSTRING_INDEXhoạt động tốt với delimiter đơn giản.