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

MySQL: ทำงานกับ Array Variable ด้วย UNION ALL และ DUAL

การจำลอง Array ใน MySQL ด้วย UNION ALL บนตาราง DUAL

MySQL ไม่มี Array Variable แบบ Built-in แต่สามารถสร้าง Result Set ที่ทำงานคล้าย Array ได้โดยใช้ UNION ALL รวมหลาย SELECT ... FROM DUAL (DUAL = Dummy Table 1 แถว)

ไวยากรณ์ (Syntax)

SELECT yourValue1 AS ArrayValue FROM DUAL
UNION ALL SELECT yourValue2 FROM DUAL
UNION ALL SELECT yourValue3 FROM DUAL
...
UNION ALL SELECT yourValueN FROM DUAL;

ตัวอย่าง: สร้าง "Array" ตัวเลข 1-10

mysql> SELECT 1 AS ArrayValue FROM DUAL
    -> UNION ALL SELECT 2 FROM DUAL
    -> UNION ALL SELECT 3 FROM DUAL
    -> UNION ALL SELECT 4 FROM DUAL
    -> UNION ALL SELECT 5 FROM DUAL
    -> UNION ALL SELECT 6 FROM DUAL
    -> UNION ALL SELECT 7 FROM DUAL
    -> UNION ALL SELECT 8 FROM DUAL
    -> UNION ALL SELECT 9 FROM DUAL
    -> UNION ALL SELECT 10 FROM DUAL;
+------------+
| ArrayValue |
+------------+
| 1          |
| 2          |
| 3          |
| 4          |
| 5          |
| 6          |
| 7          |
| 8          |
| 9          |
| 10         |
+------------+
10 rows in set (0.00 sec)

คำอธิบาย

  • DUAL เป็นตารางดमी (Dummy) มี 1 แถว 1 คอลัมน์ ใช้สำหรับ SELECT ที่ไม่ต้องการ FROM จริง
  • UNION ALL รวม Result Set ทั้งหมด (ไม่ลบ Duplicate, เร็วกว่า UNION)
  • แต่ละ SELECT ต้องมีจำนวนและลำดับคอลัมน์เท่ากัน
  • Alias AS ArrayValue ตัวแรกพอ ก็จะใช้ชื่อคอลัมน์นั้นสำหรับ Result Set ทั้งหมด

ประยุกต์ใช้จริง

-- สร้างตัวเลข 1-100 (Numbers Table)
SELECT @row := @row + 1 AS n FROM 
    (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) t1,
    (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) t2,
    (SELECT @row := 0) r
LIMIT 100;

-- MySQL 8.0+ ใช้ Recursive CTE แทน (ดีกว่ามาก)
WITH RECURSIVE nums(n) AS (
    SELECT 1 UNION ALL SELECT n+1 FROM nums WHERE n < 100
) SELECT n FROM nums;

แนะนำ: MySQL 8.0+ ให้ใช้ WITH RECURSIVE CTE หรือ GENERATE_SERIES() (MariaDB) แทน UNION ALL ยาวๆ