首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 存儲過程示例:字符串分割轉換邏輯實現

     編輯:MySQL 綜合教學

存儲過程 fun_convert 演示:接收逗號分隔字符串參數,循環解析每段,查詢公司表獲取代碼,拼接返回結果字符串。展示變量聲明、循環、動態 SQL、字符串操作、游標替代方案。

一、 存儲過程代碼


CREATE DEFINER=`root`@`%` PROCEDURE `fun_convert`(IN `para` VARCHAR(2000))
BEGIN
  DECLARE `result` VARCHAR(2000) DEFAULT '';
  DECLARE `cnt` INT DEFAULT 0;
  DECLARE `i` INT DEFAULT 1;
  DECLARE `id` VARCHAR(50);
  DECLARE `c_id` VARCHAR(50);
  
  SET `cnt` = LENGTH(`para`) - LENGTH(REPLACE(`para`, ',', '')) + 1;
  
  WHILE `i` <= `cnt` DO
    SET `id` = SUBSTRING_INDEX(SUBSTRING_INDEX(`para`, ',', `i`), ',', -1);
    SELECT `code` INTO `c_id` FROM `company` WHERE `id` = `id`;
    SET `result` = CONCAT(`result`, `c_id`, ',');
    SET `i` = `i` + 1;
  END WHILE;
  
  SELECT TRIM(TRAILING ',' FROM `result`) AS `converted`;
END

二、 調用示例


CALL `fun_convert`('1001,1002,1003');
-- 返回:'C001,C002,C003'

三、 關鍵語法點

  • DECLARE 變量必須在 BEGIN 後、首條語句前。
  • SUBSTRING_INDEX(str, delim, count):正數從左、負數從右截取第 N 段。
  • SELECT ... INTO var:單行結果賦值給變量。
  • CONCAT 字符串拼接,TRIM(TRAILING ',' FROM ...) 去尾隨逗號。
  • 無游標、無動態 SQL,純集合邏輯,效率較高。

四、 優化建議

  1. 改用 JOIN + GROUP_CONCAT 單條 SQL 完成:
    SELECT GROUP_CONCAT(c.code ORDER BY FIND_IN_SET(c.id, '1001,1002,1003')) FROM company c WHERE FIND_IN_SET(c.id, '1001,1002,1003')
  2. 若必須用存儲過程,參數改 JSON 數組(8.0+),JSON_TABLE 展開關聯查詢。
  3. 避免循環裡 SELECT,N+1 問題嚴重。
  4. 存儲過程適合「邏輯封裝、權限隔離、減少網絡往返」,但複雜集合操作首選單條 SQL。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved