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

MySQL: ใช้ IN() ใน Stored Procedure เพื่อดึงข้อมูลเฉพาะรายการ

สร้างตารางและข้อมูลตัวอย่าง

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 = uId
  • IN() มีประโยชน์มากกว่าเมื่อรับ หลายค่า (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"]');