记第一次存储过程,sql中like链表遍历使用多个OR

记一次业务需要连表查询并LIKE需要匹配多个条件。
业务是需要把表1中的查询结果集的每一个结果都去作为表2的like条件。如果使用like ‘%x%’ or like ‘%x%’ …没多个之后效率就会非常低,而且我发现sql还不能将一个子查询的结果集都作为like的条件。如果每次like‘%x%’写一个条件,这样把每个条件都走一遍实在太麻烦了,所以去查了一下存储过程,正好放在这以后自己还需要回来改一改就好。
注:这个存储过程也是参考网上资料做的。##后面的注解是我写的,–后面的注解是原来的,不用看,因为有些东西没有了,是看不懂的

DROP PROCEDURE IF EXISTS init_reportUrl; 
CREATE PROCEDURE init_reportUrl()
BEGIN
	## 定义变量
	--DECLARE s int DEFAULT 0;
	DECLARE ss varchar(255);
	 DECLARE done INT DEFAULT FALSE;
	## 定义游标,并将sql结果集赋值到游标report中
	DECLARE report CURSOR FOR SELECT DISTINCT signName FROM `database`.table ;
	##声明当游标遍历完后将标志变量置成某个值
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
	## 打开游标
	open report;
		##开启游标循环
	  cur_loop:LOOP
		-- 将游标中的值赋值给变量,注意:变量名不要和返回的列名同名,变量顺序要和sql结果列的顺序一致   
		##  变量需要在开启右表循环里面赋予  <b>也就是将结果/游标report每一次放到ss中去</b>
			fetch report into ss;
			## 执行业务逻辑
				insert into tablename1  SELECT id FROM tablename2 WHERE content LIKE concat('%',ss,'%');
				## ss会使用每次遍历游标得来的值。
						-- 将游标中的值再赋值给变量,供下次循环使用;
						-- 当s等于1时表明遍历以完成,退出循环
				IF done THEN
					LEAVE cur_loop;
				END IF;
						
		 END LOOP;
	-- 关闭游标
	close report;
END;



##调用这个存储过程,上面的全部运行一遍,再来运行这一行
call init_reportUrl()

根据我的测试使用这个存储过程的话,%前后匹配的时间是一样的,’%x%'和’x%'的速度是差不多的,几千万的数据都是用来7200s左右。具体走没走索引没有去检测

初学者 。欢迎大佬剔除错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值