MySQL 中给定子字符串的最后一个索引

我们可以使用 INSTR()函数在 MySQL 中找到给定子字符串的第一个匹配项的索引,如下所示。

SELECT instr('Have_a_good_day', '_') AS index_position

它将显示 5,指定子字符串的第一个匹配项,在本例中为下划线 _

我需要获得给定字符(或子字符串)的最后一个匹配项,比如 String 类的 JavalastIndexOf(String str)方法,但是我在 MySQL 中找不到任何内置函数。

在 MySQL 中是否有任何内置的功能来实现这一点?

99275 次浏览

我认为你可以这样使用 substring _ index:

select substring_index(string, delimiter,-1)

-1将从字符串的末尾开始。

反向/索引的组合?

SELECT LENGTH(string) - SUBSTRING_INDEX(REVERSE(string), delimiter) + 1

根据你的 Have_a_good_day分析:

REVERSE('Have_a_good_day') -> yad_doog_a_evaH
SUBSTRING_INDEX('yad_doog_a_evah', '_') -> 4
LENGTH('Have_a_good_day') -> 15
15 - 4 + 1 -> 12


Have_a_good_day
123456789012345
^

在 MySQL 中,以下语句返回12:

SELECT CHAR_LENGTH("Have_a_good_day") - LOCATE('_', REVERSE("Have_a_good_day"))+1;

下面的语句提取字符串中最后一个下划线(即 _)之前的左侧部分,以预测该值的可能用法:

SELECT LEFT("first_middle_last", CHAR_LENGTH("first_middle_last") - LOCATE('_', REVERSE("first_middle_last")));

结果是“ first _ mid”。如果要包含分隔符,请使用:

SELECT LEFT("first_middle_last", CHAR_LENGTH("first_middle_last") - LOCATE('_', REVERSE("first_middle_last"))+1);

如果他们能够增强 LOCATE,使其具有从右边开始搜索的选项,那就太好了。

如果你想要字符串最后一个空格后面的正确部分,一个更好的解决方案是:

SELECT SUBSTRING_INDEX("first_middle_last", '_', -1);

这将返回“ last”。

如果您不想要反向的开销,请使用以下方法:

LEFT
(
'Have_a_good_day',
LENGTH('Have_a_good_day') - LENGTH(SUBSTRING_INDEX('Have_a_good_day','_',-1))-1
)

虽然上面的代码对于单个字符成功地工作,但是当我使用它们查找子字符串的最后一个匹配项时,它们失败了。因此,我建议这项任务的代码如下:

SELECT LENGTH("my father is my father")
- LOCATE('father', REVERSE("my father is my father"))-(LENGTH('father')-1)

这个应该能返回17

我发现这是一个不错的技巧:

SELECT LOCATE(SUBSTRING_INDEX('Have_a_good_day', '_', -1),'Have_a_good_day')-1 AS indexpos;

这将返回上次发生(= 12)的索引。基本上,在最后一个分隔符之后搜索字符串的右侧部分,然后在整个字符串中搜索这个子字符串的位置,从而得到位置:)

如果你想得到这个子字符串的左边,你可以使用:

SELECT
SUBSTRING('Have_a_good_day', 1,
LOCATE(SUBSTRING_INDEX('Have_a_good_day', '_', -1),'Have_a_good_day')-1)
AS sub;