กรองเฉพาะค่าที่มีทศนิยม (ไม่ใช่ Integer)
ใช้ FLOOR() หรือ TRUNCATE() เปรียบเทียบกับค่าเดิม ถ้าไม่เท่ากัน = มีทศนิยม
ตัวอย่าง
CREATE TABLE DemoTable628 (Value DECIMAL(10,2));
INSERT INTO DemoTable628 VALUES
(10.97), (20.04), (12.00), (89.56);
Query: ค่าที่มีทศนิยม (≠ Integer)
SELECT * FROM DemoTable628
WHERE Value != FLOOR(Value);
ผลลัพธ์: 10.97, 20.04, 89.56 (ตัด 12.00 ออก)
+-------+
| Value |
+-------+
| 10.97 |
| 20.04 |
| 89.56 |
+-------+
วิธีอื่นๆ
| Method | Query | หมายเหตุ |
|---|---|---|
| FLOOR | Value != FLOOR(Value) | Standard, เร็ว |
| TRUNCATE | Value != TRUNCATE(Value, 0) | เหมือน FLOOR สำหรับค่าบวก |
| MOD | MOD(Value, 1) != 0 | Modulo 1 = ส่วนทศนิยม |
| CAST | Value != CAST(Value AS UNSIGNED) | Cast เป็น Integer เปรียบเทียบ |
| REGEXP | Value REGEXP '\\.[1-9]' | Regex หาจุดทศนิยมตามด้วย 1-9 |
⚠️ Floating Point Precision Issue
-- ปัญหา Binary Floating Point
SELECT 0.1 + 0.2; -- 0.30000000000000004
-- ใช้ DECIMAL แทน FLOAT/DOUBLE
CREATE TABLE t (val DECIMAL(10,2)); -- Exact
-- ถ้าต้องใช้ FLOAT ใช้ EPSILON Comparison
WHERE ABS(Value - FLOOR(Value)) > 0.000001
กรณีใช้งานจริง
- Financial: หา Transaction ที่มีเซนต์ (ไม่ใช่จำนวนเต็มบาท)
- Quality Check: ตรวจสอบ Data Entry ว่ากรอกทศนิยมครบ
- Pricing: แยกสินค้าราคา .99, .50 จากราคาเต็ม
ตัวอย่าง: แยก Integer Part และ Decimal Part
SELECT
Value,
FLOOR(Value) AS integer_part,
Value - FLOOR(Value) AS decimal_part,
CASE WHEN Value = FLOOR(Value) THEN 'Integer' ELSE 'Decimal' END AS type
FROM DemoTable628;
ผลลัพธ์:
+-------+----------------+--------------+---------+
| Value | integer_part | decimal_part | type |
+-------+----------------+--------------+---------+
| 10.97 | 10 | 0.97 | Decimal |
| 20.04 | 20 | 0.04 | Decimal |
| 12.00 | 12 | 0.00 | Integer |
| 89.56 | 89 | 0.56 | Decimal |
+-------+----------------+--------------+---------+