79

We can find the index of the first occurrence of a given substring in MySQL using the INSTR() function as follows.

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

It would display 5, the first occurrence of the specified substring which is in this case an underscore _.

I need to obtain the last occurrence of a given character (or a substring) something like the Java lastIndexOf(String str) method of the String class but I can't find any built-in function in MySQL.

Is there any built-in functionality to achieve this in MySQL?

4

6 に答える 6

168

@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);

これは「最後」を返します。

于 2013-08-24T20:17:10.000 に答える
19

次のように substring_index を使用できると思います。

select substring_index(string, delimiter,-1)

-1 は文字列の末尾から始まります。

于 2012-10-08T04:35:57.617 に答える
3

これを行うための素晴らしいトリックとしてこれを見つけました:

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;
于 2016-12-06T12:59:48.283 に答える
3

リバース/インデックスのコンボ?

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
           ^
于 2012-10-08T05:13:15.747 に答える