实现mysql中的split功能
mysql是没有split函数可以使用的,所以为了实现按照某一个符合把一长串字符串按照要求一列一列取出来需要其他的操作。
1.先把数据按照所需的要求进行修改
我们需要把依据的符号,修改成“,”
// 把";"转换成"," table 为表名 field为要修改的字段名
update table a
set field=replace(field,';',',')
where field rlike ';';
2.用json函数把字符串转换成json格式便于后续导出
// table 为表名 field为要修改的字段名
select max(JSON_LENGTH(REPLACE(JSON_ARRAY(field),',','","'))) into @looper1
from table
where fieldrlike ',';
这段MySQL查询语句使用了MySQL内置的JSON相关函数和正则表达式。具体解释如下:
-
JSON_ARRAY(field):将字段 field 的值转换为一个 JSON 数组。
-
REPLACE(JSON_ARRAY(field), ‘,’, ‘"’):将数组中的逗号替换为双引号和逗号,将其转换为一个 JSON 字符串。
-
JSON_LENGTH(REPLACE(JSON_ARRAY(field), ‘,’, ‘"’)):获取第二步中生成的 JSON 字符串的长度,其中表示多个JSON对象的逗号已被用双引号和逗号替换。
-
MAX(JSON_LENGTH(REPLACE(JSON_ARRAY(field), ‘,’, ‘"’))):获取所有行中第三步中生成的 JSON 字符串的最大长度(也就是说,最大的 JSON 数组中包含了最多的元素)。
-
INTO @looper1:将步骤 4 中获取到的最大长度值存储到用户变量
@looper1
中以备后续使用。
综上所述,这个查询用于在 table
表中查找以,
分割的 JSON 字段个数,并找出 JSON 数组中分割数量最多的一个,将其长度存储到 @looper1
的用户变量中。
3.用排序把数据一条条存放到表中
// table 为表名 field为要修改的字段名
while @looper1>0 do
insert into table
select
json_unquote(json_extract(replace(json_array(field),',','","'),concat( "$[", @looper1-1, "]" )))
from table
where field rlike ','
and json_unquote(json_extract(replace(json_array(field),',','","'),concat( "$[", @looper1-1, "]" ))) is not null;
set @looper1=@looper1-1;
end while;
这段代码是一个MySQL存储过程,它的作用是将一个包含多个值的字段(field)拆分成多行,每行只包含一个值。具体来说,它使用了JSON函数来解析字段中的值,然后将每个值插入到一个新的表中。
下面是代码的详细解释:
-
首先定义一个变量@looper1,用于循环操作。这个变量的初始值可以在存储过程中设置。
-
使用while循环,当@looper1的值大于0时,执行以下操作:
-
在新的表中插入数据,使用select语句从原始表中获取数据。这个select语句使用了JSON函数来解析字段中的值。具体来说,它使用了json_array函数将字段中的值转换为JSON数组,然后使用json_extract函数获取数组中指定位置的值。这个位置是通过@looper1变量计算得出的,每次循环时都会减1。
-
在select语句中,使用了replace函数将字段中的逗号替换为双引号,这是为了将字段中的值转换为JSON格式。然后使用concat函数构建JSON路径,以获取数组中指定位置的值。
-
在where子句中,使用了rlike运算符来匹配包含逗号的字段。然后使用json_unquote函数来去除值中的引号,以便正确地插入到新表中。
-
最后,使用set语句将@looper1的值减1,以便下一次循环。
总的来说,这段代码的作用是将一个包含多个值的字段拆分成多行,每行只包含一个值。它使用了JSON函数来解析字段中的值,并将每个值插入到一个新的表中。
4.删除数据中含有“,”的数据
// table 为表名 field为要修改的字段名
delete from table where fieldrlike ',';