Последний индекс данной подстроки в 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;