2012-10-08 48 views
44

我們可以使用INSTR()函數按如下方式找到MySQL中第一次出現給定子字符串的索引。MySQL中給定子字符串的最後一個索引

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

它將顯示5,指定子字符串這是在這種情況下的下劃線_的第一次出現。

我需要獲取給定字符(或子字符串)的最後一次出現,就像String類的Java lastIndexOf(String str)方法,但我無法在MySQL中找到任何內置函數。

在MySQL中有沒有內置的功能來實現這一點?

+0

如果有人有解決方案,那麼請添加它作爲答案。 – Tiny

回答

97

@Marc B爲緊密。在MySQL中,下面的語句返回12:

SELECT LENGTH("Have_a_good_day") - LOCATE('_', REVERSE("Have_a_good_day"))+1; 

預期可能利用的價值,下面的語句提取字符串的最後一個下劃線前左部(即_):

SELECT LEFT("first_middle_last", LENGTH("first_middle_last") - LOCATE('_', REVERSE("first_middle_last"))); 

結果是「first_middle」。如果您要包括的分隔符,使用方法:

SELECT LEFT("first_middle_last", LENGTH("first_middle_last") - LOCATE('_', REVERSE("first_middle_last"))+1); 

這將是很好,如果他們增強找到要有一個選項,從右邊開始搜索。

如果你想在最後一個空格後面的字符串的右邊部分更好的解決方案是:

SELECT SUBSTRING_INDEX("first_middle_last", '_', -1); 

這將返回「最後一個」。

+0

@Tiny,我相信你現在可能會找出答案。我遇到了同樣的問題,希望發佈解決方案。 – curt

+0

確定我的解決方案是您答案中的第一個。感謝你的回答。 – Tiny

+2

SUBSTRING_INDEX非常有用!我們在php中有類似的東西嗎? – mikewasmike

4

我認爲你可以以這種方式使用SUBSTRING_INDEX:

select substring_index(string, delimiter,-1) 

-1將在字符串的結尾開始。

+0

當然,我知道我可以,但它顯示**子字符串**本身(提取後),而不是該子字符串的索引位置。在這種情況下,它會顯示'day',但我需要顯示'12'指定的子字符串的索引。 – Tiny

+0

你的文字有多長?你可以改變它,然後使用instr或定位功能?我知道它不是最理想的方式,但它會奏效。 – rizalp1

+0

在任何情況下,我不能想到反轉字符串,因爲我需要根據找到的最後一個索引提取字符串中的其他文本。 – Tiny

3

組合的reverse/indexof?

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 
123456789
     ^
+0

'SUBSTRING_INDEX('yad_doog_a_evah','_')'發出錯誤'不正確的參數在調用本地函數「SUBSTRING_INDEX」。它需要第三個參數,比如'SUBSTRING_INDEX('yad_doog_a_evah','_',1)',這種情況下產生一個子字符串'yad',而不是'_'的第一個索引。謝謝回覆。 – Tiny

+0

你有解決方案嗎?我可以做到這一點,但以一種可惡而可避免的醜惡方式。謝謝。 – Tiny

14

如果你不想REVERSE的開銷使用以下命令:

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

這正是我所擁有的,我認爲比使用'reverse'更好 - – Fr0zenFyr

+4

這與接受的答案不同之處在於不帶分隔符的字符串(如「Have」)變成空字符串而不是「Have」。 – l33t

0

雖然上述代碼的單個字符順利進行,他們失敗了,當我用他們能夠找到一個字符串的最後一次出現。因此,我建議下面的代碼完成這個任務:

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

這應返回17

0

,我發現這是一個很好的把戲做到這一點:

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; 
相關問題