2012-10-08 16 views
44

Wir können den Index des ersten Auftretens eines gegebenen Teilstrings in MySQL finden, indem wir die Funktion INSTR() wie folgt verwenden.Letzter Index eines gegebenen Teilstrings in MySQL

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

Es wäre 5, das erste Auftreten des angegebenen Teils anzuzeigen, die _ in diesem Fall einen Unterstrich ist.

Ich brauche das letzte Vorkommen eines gegebenen Zeichens (oder eines Teilstrings) etwas wie die Java lastIndexOf(String str) Methode der String-Klasse, aber ich kann keine eingebaute Funktion in MySQL finden.

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

+0

Wenn jemand eine Lösung hat, dann fügen Sie es bitte als Antwort hinzu. – Tiny

Antwort

97

@Marc B war in der Nähe. In MySQL, gibt folgende Erklärung 12:

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

eine mögliche Verwendung des Wertes Im Vorgriff auf die folgende Anweisung extrahiert den linken Teil der Zeichenfolge vor dem letzten Strich (dh _):

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

Das Ergebnis ist "first_middle". Wenn Sie das Trennzeichen enthalten sein sollen, verwenden:

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

Es wäre schön, wenn sie LOCATE verstärkt eine Option haben, um die Suche von rechts zu starten.

Wenn Sie den rechten Teil des Strings nach dem letzten Raum eine bessere Lösung wollen, ist:

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

Das gibt „letzten“.

+0

@Tiny, ich bin mir sicher, dass du wahrscheinlich schon eine Antwort gefunden hast. Ich hatte das gleiche Problem und wollte eine Lösung posten. – curt

+0

Sicher war meine Lösung die erste in Ihrer Antwort. Danke für die Antwort. – Tiny

+2

SUBSTRING_INDEX ist sehr nützlich! Haben wir etwas ähnliches in PHP? – mikewasmike

4

Ich glaube, Sie SUBSTRING_INDEX auf diese Weise verwenden können:

select substring_index(string, delimiter,-1) 

-1 am Ende der Zeichenfolge beginnen.

+0

Sicher weiß ich kann, aber es zeigt die ** Teilzeichenfolge ** selbst (nach der Extraktion wurde gemacht) und nicht die Indexposition dieser Teilzeichenfolge. In diesem Fall würde "Tag" angezeigt, aber ich muss "12" den Index der angegebenen Teilzeichenfolge anzeigen. – Tiny

+0

Wie lang ist dein Text? Können Sie es umkehren und dann Instr oder Locate-Funktionen verwenden? Ich weiß, es ist nicht der ideale Weg, aber es würde funktionieren. – rizalp1

+0

In jedem Fall kann ich nicht daran denken, die Zeichenfolge umzukehren, weil ich anderen Text innerhalb der Zeichenfolge basierend auf dem letzten gefundenen Index extrahieren muss. – Tiny

3

Kombination von Rückwärts/Index?

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

bricht es nach unten, da Ihr 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', '_')' gibt einen Fehler aus 'Falsche Parameteranzahl in der Rufen Sie die native Funktion 'SUBSTRING_INDEX' auf. Es erfordert einen dritten Parameter wie 'SUBSTRING_INDEX ('yad_doog_a_evah', '_', 1)', der eine Teilzeichenfolge 'yad' erzeugt und nicht den ersten Index von '_', der in diesem Fall '4' ist. Danke für die Antwort. – Tiny

+0

Haben Sie eine Lösung? Ich könnte es aber auf eine hässliche Art und Weise tun, die hasserfüllt und vermeidbar ist. Vielen Dank. – Tiny

14

Wenn Sie nicht der Aufwand für REVERSE verwenden mögen folgend:

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

Dies ist genau das, was ich habe und ich denke, ist besser als die Verwendung von 'reverse' – Fr0zenFyr

+4

Dies unterscheidet sich von der angenommenen Antwort in der Art, dass eine Zeichenfolge ohne das Trennzeichen, wie' Have', eine leere Zeichenfolge statt 'Have' wird. – l33t

0

Während der oben genannte Codes erfolgreich für ein einzelnes Zeichen arbeitet, konnten sie, wenn ich sie verwendet, um das letzte Vorkommen eines Teils zu finden . Ich deshalb den Code für diese Aufgabe empfehlen:

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

Diese 17

0

zurückkehren sollte ich fand dies als ein netter Trick, es zu tun:

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

Dies wird der Index des Rück letztes Vorkommen (= 12).Im Grunde suchen Sie nach dem letzten Trennzeichen den rechten Teil der Zeichenkette und suchen dann nach der Position dieser Teilzeichenkette in der ganzen Zeichenkette, die Ihnen die Position bringt :)

Wenn Sie den Teilstring nach links bekommen möchten davon können Sie verwenden:

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