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

Tin*_*iny 59 mysql string lastindexof

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

SELECT instr('Have_a_good_day', '_') AS index_position
Run Code Online (Sandbox Code Playgroud)

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

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

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

cur*_*urt 124

@Marc B很接近.在MySQL中,以下语句返回12:

SELECT CHAR_LENGTH("Have_a_good_day") - LOCATE('_', REVERSE("Have_a_good_day"))+1;
Run Code Online (Sandbox Code Playgroud)

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

SELECT LEFT("first_middle_last", CHAR_LENGTH("first_middle_last") - LOCATE('_', REVERSE("first_middle_last")));
Run Code Online (Sandbox Code Playgroud)

结果是"first_middle".如果要包含分隔符,请使用:

SELECT LEFT("first_middle_last", CHAR_LENGTH("first_middle_last") - LOCATE('_', REVERSE("first_middle_last"))+1);
Run Code Online (Sandbox Code Playgroud)

如果他们增强了LOCATE可以选择从右侧开始搜索,那就太好了.

如果你想在最后一个空格之后找到正确的字符串部分,那么更好的解决方案是:

SELECT SUBSTRING_INDEX("first_middle_last", '_', -1);
Run Code Online (Sandbox Code Playgroud)

这将返回"最后".

  • 请记住,LENGTH()返回BYTES中的长度,如果在UTF-8列上使用这些函数,结果可能会出错,因为UTF-8字符可以有1到3个字节,以便在几个不同的字段上使用这些函数是安全的字符集,改为使用CHAR_LENGTH(). (3认同)
  • SUBSTRING_INDEX非常有用!我们在PHP中有类似的东西吗? (2认同)

N D*_*N D 19

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

LEFT
(
   'Have_a_good_day', 
   LENGTH('Have_a_good_day') - LENGTH(SUBSTRING_INDEX('Have_a_good_day','_',-1))-1
)
Run Code Online (Sandbox Code Playgroud)

  • 这与已接受的答案的不同之处在于,没有分隔符的字符串(例如"Have")变为空字符串而不是"Have". (4认同)

riz*_*lp1 8

我想你可以用这种方式使用substring_index:

select substring_index(string, delimiter,-1)
Run Code Online (Sandbox Code Playgroud)

-1将从字符串的结尾开始.