2017-05-31 80 views
1

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

strrchr在php

要获得最后一次出现_(下划线),我需要传递长度。这里是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。

+0

查询? –

+0

不,我想在“这里”和“太”的数据之前 –

+0

这个和什么? –

回答

1

我没有完全得到你的例子,但我认为你想要的是传递-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

+0

我想要数据字符串在上例中刚刚显示的_(下划线)出现,但没有传递长度。 –

+0

从例1:** this_is_something **没有通过长度 –

+0

那么这不是'strrchr'那么(因为它返回匹配的事件直到字符串的末尾),你介意更新问题吗? –

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); 
2
select reverse(substr(reverse('this_is_something_here'), 1+locate('_', reverse('this_is_something_here')))); 
2

使用逆转,定位,右则更换,而无需使用长度

Set @str = 'there_is_something'; 

Select replace(@str,right(@str,locate('_',reverse(@str))),''); 
你想找到“在这里”和“太”上面
+0

哟狗,我听说OP只喜欢一个函数......所以我把你的函数放在一个函数中。 CREATE FUNCTION just_one_function(_in LONGTEXT)返回LONGTEXT DETERMINISTIC NO SQL RETURN REPLACE(_in,RIGHT(_in,LOCATE('_',REVERSE(_in))),'');' –

+0

'SELECT just_one_function('this_works_well'); '→'this_works' –

+1

是的,就像我从其他答案中所说的那样。 OP不完整 – maSTAShuFu

相关问题