首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 存儲過程實現 WHERE IN 動態列表傳參

     編輯:MySQL 資料庫相關知識

存儲過程中動態傳遞 IN 列表的兩種方案

直接寫 WHERE id IN (1,2,3) 簡單,但存儲過程參數無法直接綁定列表,需轉換策略。

方案一:FIND_IN_SET(推薦,簡潔高效)

CREATE PROCEDURE get_by_ids(IN p_ids VARCHAR(1000))
BEGIN
    SELECT * FROM table_name 
    WHERE FIND_IN_SET(field1, p_ids);
END;
  • 調用:CALL get_by_ids('1,2,3,4');
  • FIND_IN_SET(str, strlist) 內部優化,比 LIKE 快
  • 注意:列表字串**不能含空格**,長度受 VARCHAR 限制

方案二:動態 SQL 拼接(靈活但複雜)

DROP PROCEDURE IF EXISTS Proc_Test;
CREATE PROCEDURE Proc_Test(IN param1 VARCHAR(1000))
BEGIN
    SET @id = param1;
    SET @sel = 'SELECT * FROM access_record WHERE ID IN (';
    SET @sel_2 = ')';
    SET @sentence = CONCAT(@sel, @id, @sel_2);
    
    PREPARE stmt FROM @sentence;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END;
  • 適用於需動態構建完整 WHERE 條件的複雜場景
  • 需注意 SQL 注入風險,參數務必經過驗證/轉義
  • PREPARE/EXECUTE/DEALLOCATE 三步不可少

效能與選擇建議

維度FIND_IN_SET動態 SQL
寫法簡潔度⭐⭐⭐⭐⭐⭐⭐
執行效能優(內部優化)需解析優化
列表長度限制受 VARCHAR 限制受 max_allowed_packet 限制
適用場景純 ID 列表查詢複雜動態條件構建

最佳實踐

  • 優先用 FIND_IN_SET
  • 列表極長(>1000)時,考慮臨時表:CREATE TEMPORARY TABLE tmp_ids(id INT PRIMARY KEY); INSERT ...; JOIN tmp_ids
  • 應用層若用 ORM,多數支援 WHERE IN 參數綁定,無需存儲過程
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved