Bài toán
Lọc các dòng mà cột DECIMAL có phần thập phân khác 0 (ví dụ: 10.97, 20.04) và loại bỏ số nguyên (12.00).
Giải pháp: So sánh với FLOOR()
Tạo bảng:
CREATE TABLE DemoTable628 (Value DECIMAL(10,2));
INSERT INTO DemoTable628 VALUES (10.97), (20.04), (12.00), (89.56);
Truy vấn:
SELECT * FROM DemoTable628
WHERE Value != FLOOR(Value);
Kết quả:
+-------+
| Value |
+-------+
| 10.97 |
| 20.04 |
| 89.56 |
+-------+
Giải thích
FLOOR(Value): Làm tròn xuống số nguyên gần nhất (10.97 → 10, 12.00 → 12).Value != FLOOR(Value): TRUE chỉ khi có phần thập phân ≠ 0.
Các cách khác
-- Dùng MOD (modulo 1)
WHERE MOD(Value, 1) != 0
-- Dùng TRUNCATE
WHERE Value != TRUNCATE(Value, 0)
-- Dùng CAST sang INT
WHERE Value != CAST(Value AS UNSIGNED)
-- Kiểm tra phần thập phân trực tiếp (MySQL 8.0)
WHERE Value - FLOOR(Value) > 0
So sánh hiệu năng
- Tất cả đều không dùng index (function trên cột).
FLOORvàTRUNCATEnhanh tương đương.- Với dữ liệu lớn: Thêm cột generated
is_float BOOLEAN GENERATED ALWAYS AS (Value != FLOOR(Value)) STORED+ index.
Lưu ý kiểu dữ liệu
DECIMAL(p,s): Exact numeric, chính xác cho tiền tệ.FLOAT/DOUBLE: Approximate, có thể 10.97 lưu thành 10.969999... → so sánh != FLOOR() vẫn đúng nhưng cần cẩn thận.- Luôn dùng DECIMAL cho tiền tệ, đo lường chính xác.