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