Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Triển khai truy vấn điều kiện trong MySQL Stored Procedure?

Giải pháp: IF-ELSE trong Stored Procedure

MySQL hỗ trợ cấu trúc điều khiển IF-THEN-ELSE-END IF trong Stored Procedure.

Ví dụ minh họa

Tạo 2 bảng dữ liệu

mysql> CREATE TABLE DemoTable1 (Id INT);
mysql> INSERT INTO DemoTable1 VALUES(10), (20), (30);

mysql> CREATE TABLE DemoTable2 (Id INT);
mysql> INSERT INTO DemoTable2 VALUES(40), (50), (60);

Tạo Stored Procedure có điều kiện

DELIMITER //
CREATE PROCEDURE Conditional_Query(IN param_id INT)
BEGIN
    IF param_id >= 40 THEN
        SELECT * FROM DemoTable2;
    ELSE
        SELECT * FROM DemoTable1;
    END IF;
END //
DELIMITER ;

Gọi procedure

mysql> CALL Conditional_Query(100);
+------+
| Id   |
+------+
| 40   |
| 50   |
| 60   |
+------+

mysql> CALL Conditional_Query(13);
+------+
| Id   |
+------+
| 10   |
| 20   |
| 30   |
+------+

Cú pháp IF hoàn chỉnh

IF condition1 THEN
    -- statements
ELSEIF condition2 THEN
    -- statements
ELSE
    -- statements
END IF;

Ứng dụng thực tế: Phân trang có điều kiện

CREATE PROCEDURE GetProducts(
    IN category_id INT,
    IN price_min DECIMAL(10,2),
    IN price_max DECIMAL(10,2),
    IN sort_by VARCHAR(20),
    IN page INT,
    IN page_size INT
)
BEGIN
    DECLARE offset_val INT DEFAULT (page - 1) * page_size;
    
    SET @sql = CONCAT(
        'SELECT * FROM products WHERE 1=1'
    );
    
    IF category_id > 0 THEN
        SET @sql = CONCAT(@sql, ' AND category_id = ', category_id);
    END IF;
    
    IF price_min IS NOT NULL THEN
        SET @sql = CONCAT(@sql, ' AND price >= ', price_min);
    END IF;
    
    IF price_max IS NOT NULL THEN
        SET @sql = CONCAT(@sql, ' AND price <= ', price_max);
    END IF;
    
    SET @sql = CONCAT(@sql, ' ORDER BY ', sort_by, ' LIMIT ', page_size, ' OFFSET ', offset_val);
    
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END

Lưu ý

  • Không dùng IF bên ngoài Procedure/Function/Trigger
  • Dynamic SQL (PREPARE/EXECUTE) cần thiết khi tên bảng/cột động
  • Cẩn trọng SQL Injection khi CONCAT input người dùng