it-swarm.com.de

Letzter Index eines bestimmten Teilstrings in MySQL

Wir können den Index des ersten Vorkommens eines bestimmten Teilstrings in MySQL mithilfe der Funktion INSTR() wie folgt ermitteln.

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

Es würde 5 anzeigen, das erste Vorkommen des angegebenen Teilstrings, in diesem Fall ein Unterstrich _.

Ich muss das letzte Vorkommen eines bestimmten Zeichens (oder eines Teilstrings) wie die Java lastIndexOf(String str) - Methode der String-Klasse abrufen, aber ich kann keine integrierte Funktion in MySQL finden.

Gibt es eine integrierte Funktionalität, um dies in MySQL zu erreichen?

51
Tiny

@ Marc B war in der Nähe. In MySQL gibt die folgende Anweisung 12 zurück:

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

In Erwartung einer möglichen Verwendung des Werts extrahiert die folgende Anweisung den linken Teil der Zeichenfolge vor dem letzten Unterstrich (d. H., _):

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

Das Ergebnis ist "first_middle". Wenn Sie das Trennzeichen einfügen möchten, verwenden Sie:

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

Es wäre schön, wenn sie LOCATE verbessern würden, um eine Option zum Starten der Suche von rechts zu haben.

Wenn Sie nach dem letzten Leerzeichen den rechten Teil der Zeichenfolge wünschen, ist eine bessere Lösung: 

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

Dies gibt "zuletzt" zurück.

112
curt

Wenn Sie den Overhead von REVERSE nicht wünschen, verwenden Sie Folgendes:

LEFT
(
   'Have_a_good_day', 
   LENGTH('Have_a_good_day') - LENGTH(SUBSTRING_INDEX('Have_a_good_day','_',-1))-1
)
18
N D

Ich denke, Sie können substring_index auf diese Weise verwenden:

select substring_index(string, delimiter,-1)

-1 beginnt am Ende der Zeichenkette.

7
rizalp1

Kombination von Reverse/Indexof?

SELECT LENGTH(string) - SUBSTRING_INDEX(REVERSE(string), delimiter) + 1

brechen sie ab, wenn ihr Have_a_good_day gegeben ist:

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
           ^
3
Marc B

Ich fand das als einen schönen Trick, um es zu tun:

SELECT LOCATE(SUBSTRING_INDEX('Have_a_good_day', '_', -1),'Have_a_good_day')-1 AS indexpos;

Dies gibt den Index des letzten Vorkommens zurück (= 12). Grundsätzlich suchen Sie nach dem rechten Teil des Strings nach dem letzten Trennzeichen und suchen dann nach der Position dieses Teilstrings im gesamten String, wodurch Sie die Position erhalten :)

Wenn Sie den Teilstring links davon anzeigen möchten, können Sie Folgendes verwenden:

SELECT
  SUBSTRING('Have_a_good_day', 1, 
     LOCATE(SUBSTRING_INDEX('Have_a_good_day', '_', -1),'Have_a_good_day')-1) 
  AS sub;
1
Asped

Die obigen Codes funktionieren zwar für ein einzelnes Zeichen, sie sind jedoch fehlgeschlagen, als ich sie zum letzten Auftreten eines Teilstrings verwendet habe. Ich empfehle daher den folgenden Code für diese Aufgabe:

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

Dies sollte 17 zurückkehren

0
Adewole Kayode