Mysql 写SQL记录(批量造数据、2个逗号分割的字符串是否有交集函数、拆分,分隔的数据为多行等)

1.批量造数据SQL

delimiter $
create PROCEDURE insertData2()
		BEGIN
		DECLARE i INT;
		set i=0;
		WHILE i<1000 DO
				INSERT INTO table_name(id,name) VALUE(i, CONCAT('姓名',i));
				set i=i+1;
		end WHILE;
END $
CALL insertData2;

#==============================================

drop procedure if exists insert_emp;
delimiter ;;
create procedure insert_emp()       
begin
  declare i int;                   
  set i=1;                         
  while(i<=5)do                
    insert into table_name(id,name) 
		values(i, CONCAT('姓名',i)); 
    set i=i+1;                      
  end while;
end;;
delimiter ;
call insert_emp();

2.MYSQL中判断2个逗号分割的字符串是否有交集 函数

CREATE FUNCTION `INTE_ARRAY`(setA varchar(255) charset utf8,setB varchar(255) charset utf8) RETURNS int(1)
BEGIN
    DECLARE idx INT DEFAULT 0 ; -- B 集合单元索引 
    DECLARE len INT DEFAULT 0;-- B 集合表达式长度
    DECLARE llen INT DEFAULT 0;-- 最后检查位置
    DECLARE clen INT DEFAULT 0;-- 当前检查位置
    DECLARE tmpStr varchar(255) charset utf8;-- 临时检查数据集
    DECLARE curt varchar(255) charset utf8;-- B 当前检查的单元
    SET len = LENGTH(setB);
    WHILE idx < len DO
        SET idx = idx + 1;
        SET tmpStr = SUBSTRING_INDEX(setB,",",idx);
        SET clen = LENGTH(tmpStr);
-- 获取当前 setB 中的单元
        IF idx = 1 THEN SET curt = tmpStr;
        ELSE SET curt = SUBSTRING(setB,llen+2,clen-llen-1);
        END IF;
-- 检查是否存在于 setA 中
        IF FIND_IN_SET(curt,setA) > 0 THEN RETURN 1;
        END IF;
-- 当前检查终点与上次检查终点相同则跳出
        IF clen <= llen THEN RETURN 0;
        END IF;
 
        SET llen = clen;
    END WHILE;
    RETURN 0;
END 


#INTE_ARRAY() 函数反1或0,它把两个以逗号分割的字符串进行交集检测,有交集返回1,无交集返回0。
#实例
select INTE_ARRAY("1,3,5,9","8,2,3,7") as is_inte_array; -- 1
select INTE_ARRAY("电子信息,科技","电子信息科技,软件工程") as is_inte_array; -- 0
select INTE_ARRAY("电子信息,科技","电子信息") as is_inte_array; -- 1
select INTE_ARRAY("电子信息,科技","电子信息,科技") as is_inte_array; -- 1
-- 不应把单个逗号也算作交集
select INTE_ARRAY(",","电子信息,科技") as is_inte_array; -- 0

查询 ,拆分,号分隔的数据 为多行

在这里插入图片描述
在这里插入图片描述

SELECT
    a.id,
		-- /*先正着取出几部分*/,然后在此基础再倒着取出最后那一部分
    substring_index( substring_index(a.names,',',b.help_topic_id + 1),',' ,- 1  ) AS split_name
from
-- 将原数据先取出来  like中的符号与实际表里字段中的分割符对应
(select id,names from table_name) a
join 
mysql.help_topic b   -- mysql帮助表 内含字符等 ,help_topic_id是从0开始的,其实使用的是它的计数功能       
ON  -- on的条件筛选结束后,如果改行此字段分割完后有三部分,则总共产生3条记录
b.help_topic_id < ( length(a.names) - length(REPLACE (a.names, ',', ''))  + 1 ) -- 实际算出的是分割后总共有几部分(此处是将长度为1的英文状态替换成空)

#===================================================

SELECT 
a.id,
a.names,
(SUBSTRING_INDEX(SUBSTRING_INDEX(a.systemNames,',',b.help_topic_id+1),',',-1) ) as name
from (
	select id,names from table_name
) a 
left join mysql.help_topic b -- mysql帮助表 内含字符等 ,help_topic_id是从0开始的,其实使用的是它的计数功能
on b.help_topic_id < (LENGTH(a.names )-LENGTH(REPLACE(a.names ,',',''))+1)
ORDER BY a.id
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值