MySQL ไม่มีฟังก์ชัน GENERATE_SERIES() แบบ PostgreSQL แต่สามารถสร้างช่วงตัวเลขได้ด้วย Stored Procedure และ Temporary Table
ตัวอย่าง: สร้างตัวเลข 10 ถึง 1
1. สร้างตารางรับข้อมูล
mysql> CREATE TABLE GeneratingNumbersDemo (
-> Number INT
-> );
Query OK, 0 rows affected (0.55 sec)
2. สร้าง Stored Procedure
mysql> DELIMITER //
mysql> CREATE PROCEDURE Stored_ProcedureToGenerateNumbersDemo()
-> BEGIN
-> DECLARE start INT DEFAULT 10;
-> WHILE start > 0 DO
-> INSERT INTO GeneratingNumbersDemo VALUES (start);
-> SET start = start - 1;
-> END WHILE;
-> END //
Query OK, 0 rows affected (0.12 sec)
mysql> DELIMITER ;
3. เรียกใช้ Procedure
mysql> CALL Stored_ProcedureToGenerateNumbersDemo();
Query OK, 1 row affected (0.85 sec)
4. ตรวจสอบผลลัพธ์
mysql> SELECT * FROM GeneratingNumbersDemo;
+--------+
| Number |
+--------+
| 10 |
| 9 |
| 8 |
| 7 |
| 6 |
| 5 |
| 4 |
| 3 |
| 2 |
| 1 |
+--------+
10 rows in set (0.00 sec)
รูปแบบทั่วไป: สร้างช่วง [start, end]
CREATE PROCEDURE GenerateRange(IN start_val INT, IN end_val INT)
BEGIN
DECLARE current INT DEFAULT start_val;
TRUNCATE TABLE GeneratingNumbersDemo; -- ล้างข้อมูลเก่า
WHILE current <= end_val DO
INSERT INTO GeneratingNumbersDemo VALUES (current);
SET current = current + 1;
END WHILE;
END
วิธีอื่นที่ไม่ใช้ Stored Procedure
ใช้ Recursive CTE (MySQL 8.0+)
WITH RECURSIVE numbers AS (
SELECT 1 AS n
UNION ALL
SELECT n + 1 FROM numbers WHERE n < 100
)
SELECT n FROM numbers;
ใช้ตารางตัวเลขสำเร็จรูป (Numbers Table / Tally Table)
CREATE TABLE numbers (n INT PRIMARY KEY);
INSERT INTO numbers VALUES (0),(1),(2)...(10000);
-- ใช้งาน
SELECT n FROM numbers WHERE n BETWEEN 10 AND 20;
การเลือกวิธี
| วิธี | MySQL Version | ความยุ่งยาก | ประสิทธิภาพ |
|---|---|---|---|
| Stored Procedure + Temp Table | 5.0+ | ปานกลาง | ดีสำหรับใช้ซ้ำ |
| Recursive CTE | 8.0+ | ง่าย | ดีมาก |
| Numbers Table | All | ต้องสร้างก่อน | เร็วที่สุด |