问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

mysql 创建存储过程中用到循环,怎么通过select返回结果集

发布网友 发布时间:2022-04-08 04:05

我来回答

1个回答

热心网友 时间:2022-04-08 05:35

测试表与测试数据
CREATE TABLE TestMulToOne (
  name       VARCHAR(10),
  allTitles  VARCHAR(200)
);
INSERT INTO TestMulToOne VALUES ('张三', '程序员,系统管理员,网络管理员');
INSERT INTO TestMulToOne VALUES ('李四', '项目经理,系统分析员');


   
 
DELIMITER //
DROP FUNCTION GetTextCount //
/**********
-- 获取字符串中有几个部分.
**********/
CREATE FUNCTION GetTextCount(pSourceText  VARCHAR(255),  pDivChar  CHAR(1))
RETURNS TINYINT
BEGIN
 -- 预期结果. 
 DECLARE vResult TINYINT;
 -- 当前逗号的位置.
 DECLARE vIndex INT;
 -- 前一个逗号的位置.
 DECLARE vPrevIndex INT;
 -- 结果的初始值.
 SET vResult = 1;
 -- 查询第一个 逗号的位置.
 SET vIndex = INSTR(pSourceText, pDivChar);
 IF vIndex = 0 THEN
  -- 参数中没有逗号,直接返回.
  RETURN vResult;
 END IF;
 -- 初始化情况,前一个逗号不存在.
 SET vPrevIndex = 0;
 -- 循环处理。
 WHILE vIndex > 0 DO
  -- 结果递增.
  SET vResult = vResult + 1;  
  -- 前一个逗号的位置 = 当前逗号的位置
  SET vPrevIndex = vIndex;
  -- 查询下一个逗号的位置.
  SET vIndex = LOCATE(pDivChar,  pSourceText,  vPrevIndex + 1);
 END WHILE;
 -- 返回结果.
 RETURN vResult;
END;
//
 
DROP FUNCTION GetTextValue //
/**********
-- 获取字符串中具体某一个部分的数据.
**********/
CREATE FUNCTION GetTextValue(pSourceText  VARCHAR(255),  pDivChar  CHAR(1), pIndex  TINYINT)
RETURNS VARCHAR(255) 
BEGIN
 -- 预期结果. 
 DECLARE vResult VARCHAR(255);
 IF pIndex = 1 THEN
  SELECT SUBSTRING_INDEX(pSourceText,  pDivChar,  1)  INTO  vResult;
 ELSE
  SELECT 
   REPLACE(
    SUBSTRING_INDEX(pSourceText,  pDivChar,  pIndex),
    CONCAT(SUBSTRING_INDEX(pSourceText,  pDivChar,  pIndex - 1) , pDivChar),
    '') INTO  vResult;
 END IF;
 
 -- 返回.
 RETURN vResult;
END;
//

DELIMITER ;

/*
SELECT GetTextCount('程序员,系统管理员,网络管理员', ',') AS Co;
SELECT 
 GetTextValue('程序员,系统管理员,网络管理员', ',', 1) AS A,
 GetTextValue('程序员,系统管理员,网络管理员', ',', 2) AS B,
 GetTextValue('程序员,系统管理员,网络管理员', ',', 3) AS C;
*/


   
SELECT
 t.name,
 GetTextValue(t.allTitles, ',', MaxNum.No) AS OneTitle
FROM
 TestMulToOne t,
 (SELECT 1 No UNION ALL
  SELECT 2 No UNION ALL
  SELECT 3 No UNION ALL
  SELECT 4 No UNION ALL
  SELECT 5 No ) MaxNum
WHERE
 GetTextCount(t.allTitles, ',') >= MaxNum.No
ORDER BY
 t.name;
 
+------+------------+
| name | OneTitle   |
+------+------------+
| 张三 | 系统管理员 |
| 张三 | 网络管理员 |
| 张三 | 程序员     |
| 李四 | 系统分析员 |
| 李四 | 项目经理   |
+------+------------+
5 rows in set (0.00 sec)

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
自离后能补办离职证明吗? 我是家里自离的,可以补办辞职手续吗 急救!!!狗狗受凉吃什么就吐什么,该吃什么药 狗狗受凉呕吐吃什么药好得快 公告栏标题里的字如何设定字体及大小 公告栏怎移动啊 我的公告栏 如何设置 怎么让QQ拍拍公告栏文字不滚动 在滚动的公告栏中鼠标放上去时就停止,这种效果怎么做?谢谢了 王者荣耀铂金1和黄金3双排排到的是什么段位的 济南去齐河怎么走最近? 山东德州到齐河的汽车多长时间一班,车程大概是多长时间 从济南市历城区董家镇如何去齐河极地海洋世界 我想去齐河的欧乐堡,我在济宁有谁知道怎么走啊? 在济南去齐河海洋馆怎么坐车 求云海翻腾孙悟空[张卫健主演]和天地争霸美猴王[陈浩民主演] 国语 百度云资源 高铁济南西站有车到齐河县吗? 求十篇英语作文和日记 在齐河海底世界到齐河汽车站坐几路公交啊? 急求初中英语作文、日记,现实一点的,真实一点的,简单一点的 德州到齐河极地海洋世界做什么车?怎么倒车?多长时间?门票多少钱?谢谢了 没去过 所以问的详细点!谢谢了 从济南大学东校区怎么去齐河? 宋叶肖严西湖十景图册的基本资料 请:问喝普洱茶伤胃吗? 期指开空仓是什么意思 怎样从济南去齐河欧乐堡,K906现在还有吗?坐到哪一站? 浙江西湖的山水西湖 垫资股指期货开户是什么意思? 求济南到齐河 K904 k906 公交路线 谢谢 英语作文我的日记5句 求张卫健国语版西游记第一部和第二部天地争霸美猴王百度云链接,有的话麻烦分享文件夹过来谢谢 从济南火车站到山东农业工程学院齐河校区齐河齐晏大街699号最便捷的路线乘坐公交。 从济南到齐河站K904或者K906一共多少钱??? 从聊城市冠县坐客车去泉城欧乐堡梦幻世界,在哪下车坐几路公交车到达呀 齐河汽车站到欧乐堡戏水湾泰式怎么去 坐公交车怎么去济南欧乐堡? 求具体公交车路线, 生完的宝妈,会让老公帮着吸奶吗 宝妈们和老公一晚上最多几次 宝妈们白天和老公做过吗 宝妈是怎么给老公解决的 宝妈们你们会不会亲老公的哪个 宝妈们,,来了大姨妈,老公想要怎么办啊,看他苦苦哀求,不给他又怕他伤心,好,纠结啊,希望给点建议 有宝妈们很少和老公接吻的吗 有没有和老公KJ过的宝妈 词语热枕还是热忱? 女人在怀了宝宝之后,丈夫有“生理需求”该怎么办? 热忱的拼音是什么? 宝妈有没有吃过老公 宝妈有和老公朋友插过吗 想知道热枕还是热忱?