直接寫 WHERE id IN (1,2,3) 簡單,但存儲過程參數無法直接綁定列表,需轉換策略。
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 限制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;
PREPARE/EXECUTE/DEALLOCATE 三步不可少| 維度 | FIND_IN_SET | 動態 SQL |
|---|---|---|
| 寫法簡潔度 | ⭐⭐⭐⭐⭐ | ⭐⭐ |
| 執行效能 | 優(內部優化) | 需解析優化 |
| 列表長度限制 | 受 VARCHAR 限制 | 受 max_allowed_packet 限制 |
| 適用場景 | 純 ID 列表查詢 | 複雜動態條件構建 |
FIND_IN_SETCREATE TEMPORARY TABLE tmp_ids(id INT PRIMARY KEY); INSERT ...; JOIN tmp_idsWHERE IN 參數綁定,無需存儲過程