有时我们需要对某个字段的值进行分割,那我们怎样快速的实现字符串的分割呢?
这时我们就需要用到 SUBSTRING_INDEX 函数了
函数:SUBSTRING_INDEX(str,delim,count)
解释:从第 count 个 分割符(delim) 处分割字符串(str),返回子字符串。
参数说明:
str:将要处理的字符串
delim :用来分割 str 分割符
count:第 count 个分割符
返回值:
若 count 为正,则返回分割符左侧的所有内容(从左侧开始计数);
若 count 为负,则返回分割符右边的所有内容(从右边开始计数)。
注:分割符是大小写敏感的
示例 一:
示例二:
例子三:
本文用到的代码:
-- 例子一:
set @str = 'share_conten_mi_a1_b2_c3';
select SUBSTRING_INDEX(@str, '_', 2) result_str union all
select SUBSTRING_INDEX(@str, '_', -2);
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- 例子二:
-- step1: 先创建一个临时表
drop temporary table if exists tmp_test;
create temporary table tmp_test
select 1 id , 1 delim_index union all
select 2 id , 2 delim_index union all
select 3 id , 3 delim_index union all
select 4 id , 4 delim_index union all
select 5 id , 5 delim_index union all
select 6 id , 6 delim_index union all
select 7 id , 7 delim_index union all
select 8 id , 8 delim_index ;
-- step 2:
set @str = 'share_conten_mi_a1_b2_c3' -- 将要处理的字符串
,@delim = '_' ; -- 分割符
set @delim_max_index = LENGTH(@Str) - LENGTH(REPLACE(@str, @delim, '')) + 1 ;-- 分割符的最大下标 ;
select
id -- 序号
,delim_index -- 第 n 个 分割符
,case when @delim_max_index >= delim_index -- 从左侧开始
then SUBSTRING_INDEX(@str, @delim, delim_index)
else '已分割完' end str1
,case when @delim_max_index >= delim_index
then SUBSTRING_INDEX(@str, @delim, delim_index * -1) -- 从右侧开始
else '已分割完' end str2
,case when @delim_max_index >= delim_index
then SUBSTRING_INDEX(SUBSTRING_INDEX(@str, @delim, delim_index),'_', -1)
else '已分割完' end str3
from tmp_test;
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- 例子三:若想将字符串都按分割符分割,并写入一张表里,可 参考下面的例子
set @str = 'share_conten_mi_a1_b2_c3'
,@delim = '_'
,@delim_max_index = LENGTH(@Str) - LENGTH(REPLACE(@str, @delim, '')) + 1 ;
select SUBSTRING_INDEX(SUBSTRING_INDEX(@str, @delim, delim_index),'_', -1) str from tmp_test
where @delim_max_index >= delim_index;
参考:https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_substring-index