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

การค้นหาค่าระหว่างช่วงใน MySQL ด้วย BETWEEN บนคอลัมน์ VARCHAR

คำสั่ง BETWEEN ใน MySQL ทำงานกับชนิดข้อมูล VARCHAR ได้โดยเปรียบเทียบตามลำดับ Lexicographical (ตัวอักษร) ซึ่งใช้ได้กับรหัสที่มีรูปแบบคงที่ (เช่น EMP_001, EMP_002) เพื่อค้นหาช่วงรหัส

ตัวอย่างการใช้งาน

สร้างตารางรหัสพนักงาน:

mysql> CREATE TABLE DemoTable1473 (EmployeeCode VARCHAR(20));

เพิ่มข้อมูล:

mysql> INSERT INTO DemoTable1473 VALUES ('EMP_120'), ('EMP_125'), ('EMP_30'), ('EMP_130');

ดูข้อมูล:

mysql> SELECT * FROM DemoTable1473;
+--------------+
| EmployeeCode |
+--------------+
| EMP_120      |
| EMP_125      |
| EMP_30       |
| EMP_130      |
+--------------+

ค้นหารหัสระหว่าง EMP_124 ถึง EMP_129:

mysql> SELECT * FROM DemoTable1473
    -> WHERE EmployeeCode BETWEEN 'EMP_124' AND 'EMP_129';

ผลลัพธ์ (เจอ EMP_125):

+--------------+
| EmployeeCode |
+--------------+
| EMP_125      |
+--------------+

หลักการเปรียบเทียบ String

  • เปรียบเทียบทีละตัวอักษรจากซ้ายไปขวา
  • 'EMP_124' < 'EMP_125' < 'EMP_129' < 'EMP_130' ✓
  • 'EMP_30' < 'EMP_120' เพราะ '3' > '1' ตำแหน่งที่ 5 ✗ (Logic ตัวเลขแตกต่าง String)

ข้อควรระวัง: Zero Padding สำคัญมาก

แก้ไข: ใช้ LPAD/RPAD หรือ FORMAT ให้ความยาวคงที่: LPAD(num, 3, '0') → '030', '120', '125'

แนวทางที่ดีกว่า

  1. แยกคอลัมน์: Prefix VARCHAR(10), Number INT → Index บน Number, WHERE Number BETWEEN 124 AND 129
  2. Generated Column: num INT GENERATED ALWAYS AS (CAST(SUBSTRING(EmployeeCode, 5) AS UNSIGNED)) STORED + Index
  3. CAST ใน Query: WHERE CAST(SUBSTRING(EmployeeCode, 5) AS UNSIGNED) BETWEEN 124 AND 129 (ไม่ใช้ Index)

สรุป

  • BETWEEN บน VARCHAR ใช้ได้เฉพาะข้อมูลที่ Zero-padded / Fixed-width แล้ว
  • ควรออกแบบ Schema ให้แยกส่วนตัวเลขออกมาเป็นคอลัมน์ NUMBER
  • ใช้ CAST/SUBSTRING ใน Query ชั่วคราว แต่ไม่ควรใช้ใน Production ที่มีข้อมูลเยอะ
รูปแบบตัวอย่างBETWEEN 'EMP_124' AND 'EMP_129'
Zero-padded (Good)EMP_030, EMP_120, EMP_125ทำงานถูกต้อง
No padding (Bad)EMP_30, EMP_120, EMP_125EMP_30 จะอยู่ "หลัง" EMP_129 ผิดพลาด!