การใช้ Expression (นิพจน์) เต็มรูปแบบใน WHERE Clause ของ MySQL
MySQL อนุญาตให้ใช้ expression (การคำนวณ/ฟังก์ชัน) ใน WHERE clause ได้โดยตรง — ไม่ต้องคำนวณไว้ใน SELECT หรือ subquery ก่อน
สร้างตารางและข้อมูล
mysql> create table DemoTable1406 (
-> Value int
-> );
Query OK, 0 rows affected (0.47 sec)
mysql> insert into DemoTable1406 values(10);
mysql> insert into DemoTable1406 values(50);
mysql> insert into DemoTable1406 values(40);
mysql> insert into DemoTable1406 values(30);
ข้อมูลทั้งหมด
+-------+ | Value | +-------+ | 10 | | 50 | | 40 | | 30 | +-------+
คำสั่ง WHERE ใช้ Expression โดยตรง
mysql> select Value + 10 as ExpectedValue
-> from DemoTable1406
-> where Value + 10 = 40;
ผลลัพธ์
+---------------+ | ExpectedValue | +---------------+ | 40 | +---------------+
อธิบาย
Value + 10 = 40— เงื่อนไขกรอง: ค่า Value ที่บวก 10 แล้วได้ 40 (คือ Value = 30)Value + 10 as ExpectedValue— SELECT expression เดียวกัน พร้อม alias- MySQL ประเมิน expression ใน WHERE ก่อน แล้วค่อย SELECT
Expression ที่ใช้ได้ใน WHERE
- คณิตศาสตร์:
col + 10, col * 2, col / 3 - ฟังก์ชันสตริง:
UPPER(name), SUBSTRING(col, 1, 5), CONCAT(a, b) - ฟังก์ชันวันที่:
DATE_ADD(date, INTERVAL 1 DAY), YEAR(date) - CASE WHEN:
CASE WHEN status = 1 THEN 'active' ELSE 'inactive' END = 'active'
ประสิทธิภาพ: SARGable vs Non-SARGable
| SARGable (ใช้ Index ได้) | Non-SARGable (ไม่ใช้ Index) |
|---|---|
WHERE date_col > '2023-01-01' | WHERE YEAR(date_col) > 2023 |
WHERE name LIKE 'John%' | WHERE UPPER(name) = 'JOHN' |
WHERE id = 100 | WHERE id + 0 = 100 |
แนวทาง: เขียนเงื่อนไขให้คอลัมน์อยู่ด้านซ้าย "เปล่าๆ" ไม่ห่อหุ้มฟังก์ชัน เพื่อให้ optimizer ใช้ index ได้
ใช้ Alias ใน WHERE? ไม่ได้
-- ผิด: ไม่สามารถใช้ alias ใน WHERE ระดับเดียวกัน
SELECT Value + 10 AS v10 FROM t WHERE v10 = 40; -- ERROR
-- ถูก: ใช้ subquery หรือ CTE
SELECT v10 FROM (SELECT Value + 10 AS v10 FROM t) sub WHERE v10 = 40;
-- หรือ MySQL 8.0+ ใช้ CTE
WITH cte AS (SELECT Value + 10 AS v10 FROM t) SELECT v10 FROM cte WHERE v10 = 40;