MYSQL:查找字符串中最后一个字符

时间:2017-05-31 06:09:24

标签: mysql string

  

长度将是动态的,我想在MYSQL中的字符串中最后一次出现字符之前找到数据

与php中的 strrchr 一样

  

要获得_(下划线)的最后一次出现,我需要传递长度。在这里它是3


mysql> SELECT SUBSTRING_INDEX ('this_is_something_here', '_', 3);

+----------------------------------------------------+
| SUBSTRING_INDEX ('this_is_something_here', '_', 3) |
+----------------------------------------------------+
| this_is_something                                  |
+----------------------------------------------------+
  

在这里,要获得_(下划线)的最后一次出现,我需要传递长度。在这里它是6

 

mysql> SELECT SUBSTRING_INDEX ('and_this_may_go_like_this_too', '_', 6);
+-----------------------------------------------------------+
| SUBSTRING_INDEX ('and_this_may_go_like_this_too', '_', 6) |
+-----------------------------------------------------------+
| and_this_may_go_like_this                                 |
+-----------------------------------------------------------+

  

我想要在上一个示例中最后一次出现_(下划线)之前的数据字符串,但没有传递长度。

     

注意:从上面的例子中我想要" _here"的数据。和" _too"

     

最后一次出现_(下划线)

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

先谢谢amigos。

4 个答案:

答案 0 :(得分:3)

我没有得到你的例子,但我认为你想要的是传递-1作为长度并在前面加上子串。

比较

strrchr('and_this_may_go_like_this_too', '_'); // Returns _too

SELECT SUBSTRING_INDEX('and_this_may_go_like_this_too', '_', -1);
-- Returns too, just need to concatenate `_` so...
SELECT CONCAT('_', SUBSTRING_INDEX('and_this_may_go_like_this_too', '_', -1));
-- Returns _too

如果您正在寻找之前之前的字符串部分,直到指针,并且从指针到字符串的末尾,可以使用:

SET @FULL_STRING = 'this_is_something_here';  

SELECT LEFT(@FULL_STRING, LENGTH(@FULL_STRING) - LOCATE('_', REVERSE(@FULL_STRING)));
-- Returns this_is_something

请注意,第二个声明 strrchr的作用。

答案 1 :(得分:2)

select reverse(substr(reverse('this_is_something_here'), 1+locate('_', reverse('this_is_something_here'))));

答案 2 :(得分:2)

使用反向,定位,然后直接替换而不使用长度

Set @str = 'there_is_something';

Select replace(@str,right(@str,locate('_',reverse(@str))),'');

答案 3 :(得分:1)

你可以写这样的查询

SELECT SUBSTRING_INDEX('and_this_may_go_like_this_too','_',(LENGTH('and_this_may_go_like_this_too')-LENGTH(REPLACE('and_this_may_go_like_this_too' ,'_',''))) - 1);