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

mcvgt66p  于 2023-08-02  发布在  Mysql
关注(0)|答案(7)|浏览(146)

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

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

字符串
它将显示5,即指定子字符串的第一个匹配项,在本例中为下划线_
我需要获取给定字符(或子字符串)的最后一次出现,类似于String类的Java lastIndexOf(String str)方法,但我在MySQL中找不到任何内置函数。
MySQL中有没有内置的功能来实现这一点?

v6ylcynt

v6ylcynt1#

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

jtw3ybtb

jtw3ybtb2#

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

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

字符串

wrrgggsh

wrrgggsh3#

我想你可以这样使用substring_index:

select substring_index(string, delimiter,-1)

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

mec1mxoz

mec1mxoz4#

反向/索引的组合?

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
           ^

qgzx9mmu

qgzx9mmu5#

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

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;

xmq68pz9

xmq68pz96#

虽然上面的代码可以成功地处理单个字符,但当我用它们来查找子字符串的最后一个出现时,它们就失败了。因此,我推荐下面的代码来执行这个任务:

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

字符串
返回17

b09cbbtk

b09cbbtk7#

select(length(“Have_a_good_day”)- instr(reverse(“Have_a_good_day”),'_')))from dual;

相关问题