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

สร้างช่วงตัวเลขใน MySQL ด้วย Stored Procedure

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 Table5.0+ปานกลางดีสำหรับใช้ซ้ำ
Recursive CTE8.0+ง่ายดีมาก
Numbers TableAllต้องสร้างก่อนเร็วที่สุด