Truy vấn động với WHERE IN() trong MySQL Stored Procedure
Sử dụng PREPARE và EXECUTE để xây dựng truy vấn động nhận danh sách giá trị IN().
Tạo bảng và dữ liệu
mysql> create table DemoTable ( Id int, Name varchar(20) ); Query OK, 0 rows affected (0.69 sec)
mysql> insert into DemoTable values(100,'Chris'); mysql> insert into DemoTable values(101,'Bob'); mysql> insert into DemoTable values(102,'David');
Tạo Stored Procedure
mysql> DELIMITER //
mysql> CREATE PROCEDURE whereInDemo(in input varchar(100))
-> BEGIN
-> set @Query = 'select Name from DemoTable ';
-> set @Query = CONCAT(@Query,' where Id IN (',`input`,')');
-> prepare stmt from @Query;
-> execute stmt;
-> deallocate prepare stmt;
-> END //
Query OK, 0 rows affected (0.23 sec)
mysql> DELIMITER ;
Gọi procedure
mysql> call whereInDemo('100,102');
Kết quả
+-------+ | Name | +-------+ | Chris | | David | +-------+ 2 rows in set (0.04 sec)
⚠️ Cảnh báo bảo mật: Cách này dễ bị SQL Injection nếu đầu vào không được kiểm soát. Trong môi trường sản xuất, nên sử dụng Prepared Statements với tham số hoặc hàm FIND_IN_SET() an toàn hơn.
Cách an toàn hơn:
CREATE PROCEDURE whereInDemoSafe(IN ids TEXT)
BEGIN
SELECT Name FROM DemoTable
WHERE FIND_IN_SET(Id, ids) > 0;
END