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;