Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

การค้นหาตัวเลขในช่วง +/- 1 จากคอลัมน์ใน MySQL ด้วย BETWEEN

ใช้ 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 ธรรมดา