Последний индекс данной подстроки в MySQL

Мы можем найти индекс первого вхождения данной подстроки в MySQL с помощью функции INSTR() следующим образом.

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

Он будет отображать 5, первое вхождение указанной подстроки, которое в этом случае является символом подчеркивания _.

Мне нужно получить последнее вхождение данного символа (или подстроки), что-то вроде метода Java lastIndexOf(String str) класса String но я не могу найти встроенную функцию в MySQL.

Есть ли встроенная функциональность для этого в MySQL?

Ответ 1

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

Было бы неплохо, если бы они улучшили LOCATE, чтобы иметь возможность запускать поиск справа.

Если вы хотите, чтобы правая часть строки после последнего пространства была лучше, выполните следующее:

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

Это возвращает "последний".

Ответ 2

Если вы не хотите, чтобы накладные расходы REVERSE использовали следующее:

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

Ответ 3

Я думаю, вы можете использовать substring_index таким образом:

select substring_index(string, delimiter,-1)

-1 начнется в конце строки.

Ответ 4

Комбинация обратного/индекса?

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
           ^

Ответ 5

В то время как вышеприведенные коды успешно работают для одного символа, они потерпели неудачу, когда я использовал их для поиска последнего вхождения подстроки. Поэтому я рекомендую следующий код для этой задачи:

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

Это должно вернуть 17

Ответ 6

Я нашел это как хороший трюк, чтобы сделать это:

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;