我们可以使用INSTR()
函数找到MySQL中第一次出现给定子字符串的索引,如下所示。
SELECT instr('Have_a_good_day', '_') AS index_position
它会显示5
,这是指定子字符串的第一次出现,在这种情况下是下划线_
。
我需要获取给定字符(或子字符串)的最后一次出现,比如String类的Java lastIndexOf(String str)
方法,但我在MySQL中找不到任何内置函数。
在MySQL中是否有任何内置功能可以实现这一目标?
答案 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