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

时间:2012-10-08 04:30:20

标签: mysql string lastindexof

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

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

它会显示5,这是指定子字符串的第一次出现,在这种情况下是下划线_

我需要获取给定字符(或子字符串)的最后一次出现,比如String类的Java lastIndexOf(String str)方法,但我在MySQL中找不到任何内置函数。

在MySQL中是否有任何内置功能可以实现这一目标?

6 个答案:

答案 0 :(得分:116)

@Marc B很接近。在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_middle”。如果要包含分隔符,请使用:

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”。

答案 1 :(得分:19)

如果您不希望REVERSE的开销使用以下内容:

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

答案 2 :(得分:7)

我认为你可以这样使用substring_index:

select substring_index(string, delimiter,-1)

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

答案 3 :(得分:2)

反向/索引的组合?

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
           ^

答案 4 :(得分:2)

我发现这是一个很好的技巧:

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;

答案 5 :(得分:0)

虽然上面的代码对单个字符成功运行,但是当我用它们来查找子字符串的最后一次出现时,它们失败了。因此,我建议使用以下代码执行此任务:

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

这应该返回17