ใช้ BETWEEN เพื่อหาค่าที่อยู่ในช่วง +/- 1 จากค่าที่กำหนด
สร้างตารางตัวอย่าง
mysql> create table DemoTable (
Value int );
Query OK, 0 rows affected (0.76 sec)
เพิ่มข้อมูลตัวอย่าง
mysql> insert into DemoTable values(14); Query OK, 1 row affected (0.15 sec) mysql> insert into DemoTable values(15); Query OK, 1 row affected (0.17 sec) mysql> insert into DemoTable values(16); Query OK, 1 row affected (0.19 sec) mysql> insert into DemoTable values(17); Query OK, 1 row affected (0.09 sec) mysql> insert into DemoTable values(18); Query OK, 1 row affected (0.09 sec)
แสดงข้อมูลทั้งหมด
mysql> select *from DemoTable;
+-------+ | Value | +-------+ | 14 | | 15 | | 16 | | 17 | | 18 | +-------+ 5 rows in set (0.00 sec)
คิวรี่หาค่าที่อยู่ในช่วง 17 +/- 1 (คือ 16-18)
mysql> select *from DemoTable where (Value-17) between -1 and 1;
ผลลัพธ์:
+-------+ | Value | +-------+ | 16 | | 17 | | 18 | +-------+ 3 rows in set (0.03 sec)
คำอธิบาย
(Value - 17) BETWEEN -1 AND 1เทียบเท่าValue BETWEEN 16 AND 18- วิธีนี้ยืดหยุ่นกว่า หากค่าอ้างอิง (17) มาจากพารามิเตอร์/ตัวแปร
BETWEENรวมขอบเขต (Inclusive)
รูปแบบอื่นๆ
-- แบบตรงไปตรงมา (แนะนำสำหรับค่าคงที่) WHERE Value BETWEEN 16 AND 18 -- ใช้ ABS() สำหรับ Absolute difference WHERE ABS(Value - 17) <= 1 -- ใช้ตัวแปร SET @target = 17, @tolerance = 1; SELECT * FROM DemoTable WHERE Value BETWEEN @target - @tolerance AND @target + @tolerance;
กรณีใช้กับ FLOAT/DECIMAL
ระวัง Precision issue:
WHERE ABS(Value - 17.0) <= 1.0001 -- เพิ่ม epsilon เล็กน้อย
ประสิทธิภาพ
การใช้ BETWEEN หรือ ABS() บนคอลัมน์ อาจไม่ใช้ Index ได้ หาก Query บ่อย ควรคำนวณช่วงใน Application แล้วส่งมาเป็น Range query ธรรมดา