Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Tách số thực thành phần nguyên và phần thập phân trong MySQL

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_INDEX hoạt động tốt với delimiter đơn giản.