สร้างตารางและข้อมูลตัวอย่าง
mysql> create table DemoTable2004 ( UserId varchar(20), UserName varchar(20) );
mysql> insert into DemoTable2004 values('John_123','John');
mysql> insert into DemoTable2004 values('23456_Carol','Carol');
mysql> insert into DemoTable2004 values('111_Bob','Bob');
ข้อมูลในตาราง
+-------------+----------+ | UserId | UserName | +-------------+----------+ | John_123 | John | | 23456_Carol | Carol | | 111_Bob | Bob | +-------------+----------+
สร้าง Stored Procedure ใช้ IN()
mysql> delimiter //
mysql> create procedure test_of_in(IN uId varchar(20))
BEGIN
select * from DemoTable2004 where UserId IN(uId);
END //
mysql> delimiter ;
เรียกใช้ Procedure
mysql> call test_of_in('23456_Carol');
ผลลัพธ์
+-------------+----------+ | UserId | UserName | +-------------+----------+ | 23456_Carol | Carol | +-------------+----------+
อธิบาย
IN(uId)ที่นี่uIdเป็นค่าเดียว (Scalar) → เทียบเท่าUserId = uIdIN() มีประโยชน์มากกว่าเมื่อรับ หลายค่า (Comma-separated List หรือ Subquery)
กรณีรับหลายค่า (CSV String → IN)
MySQL ไม่รองรับ Array Parameter ตรงๆ ต้องแปลง String → Rows:
CREATE PROCEDURE test_of_in_multi(IN uIds TEXT) -- 'John_123,111_Bob'
BEGIN
-- วิธี 1: Dynamic SQL (Simple แต่ต้องระวัง SQL Injection)
SET @sql = CONCAT('SELECT * FROM DemoTable2004 WHERE UserId IN (', uIds, ')');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-- วิธี 2: ใช้ FIND_IN_SET (MySQL Function)
-- SELECT * FROM DemoTable2004 WHERE FIND_IN_SET(UserId, uIds) > 0;
END;
FIND_IN_SET()
SELECT FIND_IN_SET('b', 'a,b,c,d'); -- คืน 2 (Position)
SELECT FIND_IN_SET('x', 'a,b,c,d'); -- คืน 0 (Not Found)
ใช้ได้เมื่อค่าที่ค้นหาไม่มี Comma อยู่ภายใน
Best Practice: ใช้ Temporary Table / JSON (MySQL 8.0+)
-- MySQL 8.0: JSON Table Function
CREATE PROCEDURE test_of_in_json(IN uIds JSON)
BEGIN
SELECT t.* FROM DemoTable2004 t
JOIN JSON_TABLE(uIds, '$[*]' COLUMNS (uid VARCHAR(20) PATH '$')) jt
ON t.UserId = jt.uid;
END;
-- เรียก: CALL test_of_in_json('["John_123", "111_Bob"]');