2017-05-31 81 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

相關問題