SUBSTRING_INDEX()
是 MySQL 中的一个字符串函数,用于根据指定的分隔符从字符串中提取子串。这个函数非常有用,特别是当你需要从字符串中按照某个分隔符获取特定的部分时。我经常会用到这个函数去处理一些字符。
SUBSTRING_INDEX(str, delim, count)
#str 是你要操作的原始字符串。
#delim 是你指定的分隔符。
#count 是一个数字,表示你想从字符串中提取的部分。
count 的值可以是正数或负数:
如果 count 是正数,函数将从字符串的开头开始,返回第 count 个分隔符之前的所有内容。
如果 count 是负数,函数将从字符串的结尾开始,返回倒数第 abs(count) 个分隔符之后的所有内容。
abs代表去绝对值,因为上述count是复数哈。
举个例子,假设我们有一个包含多个逗号分隔值的字符串 'a,b,c,d,e'
,并且我们想要提取第一个逗号之前的内容:
SELECT SUBSTRING_INDEX('a,b,c,d,e', ',', 1);
结果将是 'a',因为第一个逗号之前的内容是 'a'。
这里count取得是1,分隔符为',' 所以就会取到左边数第一个逗号之前的内容。
我们向取最后一个逗号之后的内容,把1改为-1即可。
SELECT SUBSTRING_INDEX('a,b,c,d,e', ',', -1);
结果将是 'E',因为右边数第一个逗号之后的内容是 'e'。
这里count取得是-1,分隔符为',' 所以就会取到右边数第一个逗号之后的内容。
那么这里帮助大家解决一个问题,就是如果我想取最后一个逗号之前的内容,或者,第一个逗号之后的内容应该怎么办呢。
我们可以使用char_length函数和replace函数结合,将','(分隔符)都替换为空,然后计算长度差,即可算出包含多少个,这样我们就可以在同一列,不同字符数到整数和倒数的哈。
以取最后一个逗号之前的内容为例,如下:
SELECT SUBSTRING_INDEX('a,b,c,d,e', ',', 4);
SELECT SUBSTRING_INDEX('a,b,c,d,e', ',', CHAR_LENGTH()-
CHAR_LENGTH(REPLACE('a,b,c,d,e',',','')));
#这里解释一下:
#后边这一长串CHAR_LENGTH('a,b,c,d,e')-CHAR_LENGTH(REPLACE('a,b,c,d,e',',',''))
的结果也会为4
#CHAR_LENGTH() 会获取到字符串的长度,使用REPLACE,将逗号替换为了空值,所以在外边套一层
CHAR_LENGTH,字符串长度会减去逗号的个数。
用原来的长度减去替换之后的,就获取到了逗号的总体个数。
#所以两个表达式的结果内容是一致的。都为'a,b,c,d'.
#这里之所以那么写,是因为我们在实际过程中,一个字段下遇到的分隔符数量是很有可能不一致的。
以此类推,我们只需要count位置上加一个-号,或者用后边的char_length()表达式减去前面的char_length()表达式也能得到-数,就可以获取到第一个分隔符号之后的内容啦。
这个函数在处理数据的时候非常好用,也适用于写于etl流程的sql中。