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

Lấy chỉ số thực (floating-point) từ cột DECIMAL trong MySQL

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).
  • FLOOR và TRUNCATE nhanh 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.