MySQL中给定子string的最后一个索引

我们可以使用INSTR()函数在MySQL中find给定子string的第一次出现的索引,如下所示。

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

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

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

有什么内置的function在MySQL中实现这一点?

@马克B很接近。 在MySQL中,以下语句返回12:

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

预计值的可能使用,以下语句在最后一个下划线(即_)之前提取string的左边部分:

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

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

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

如果他们增强了LOCATE可以select从右边开始search,那将会很好。

如果你想在最后一个空格之后的string的右边部分有一个更好的解决方法:

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

这返回“最后”。

如果您不想使用REVERSE的开销,请使用以下命令:

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

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

 select substring_index(string, delimiter,-1) 

-1将在string的末尾开始。

反向/索引组合?

 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 ^ 

虽然上面的代码能够成功地处理单个字符,但是当我使用它们来查找子string的最后一次出现时,它们失败了。 因此,我build议下面的代码来完成这个任务:

 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)。 基本上你在最后一个分隔符之后searchstring的右边部分,然后在整个string中search这个子string的位置,这会得到你的位置:)

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

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