»SUBSTRING_INDEX« in SQL (MySQL )
Dokumentation der Funktion »SUBSTRING_INDEX«
(Diese Dokumentation ist nicht die Original-Dokumentation, sondern eine speziell für diesen Kurs geschriebene Dokumentation.)
Lemma
SUBSTRING_INDEX
Proklamation
SUBSTRING_INDEX( Text, Trennzeichen, n )
Parameter
Text - der Text, aus dem ein Teil ausgeschnitten werden soll
Trennzeichen = eine Folge von Schriftzeichen, welche einzelne
Teile innerhalb des Textes voneinander trenntn -
Ergebnis
Falls n=0:
Ergibt den leeren Text (mit der Länge 0).Falls n>0:
Ergibt den Teil aus dem Text, der vor dem n-ten Vorkommen der
Trennzeichen liegt.Falls n<0:
Ergibt den Teil aus dem Text, der hinter dem n-ten (von rechts
gezählt) Vorkommen der Trennzeichen liegt.Bei der Interpretation der Trennzeichen wird zwischen großen
und kleinen Buchstaben unterschieden.Beispiele
SUBSTRING_INDEX( 'www.mysql.com', '.', 2 )= 'www.mysql'
SUBSTRING_INDEX( 'www.mysql.com', '.', -2 )= 'mysql.com'
Anwendungsbeispiel Teile eines Feldes entfernen
DROP SCHEMA S; CREATE SCHEMA S; USE S;
CREATE TABLE TITLE ( TITLE VARCHAR ( 255 ) );
INSERT INTO TITLE ( TITLE ) VALUES ( 'Iphigenie auf Tauris - Johann Wolfgang von Goethe' );
INSERT INTO TITLE ( TITLE ) VALUES ( 'Wilhelm Tell - Friedrich Schiller' );
INSERT INTO TITLE ( TITLE ) VALUES ( 'Der zerbrochene Krug - Heinrich von Kleist' );
SELECT * FROM TITLE;+---------------------------------------------------+
| TITLE |
+---------------------------------------------------+
| Iphigenie auf Tauris - Johann Wolfgang von Goethe |
| Wilhelm Tell - Friedrich Schiller |
| Der zerbrochene Krug - Heinrich von Kleist |
+---------------------------------------------------+
UPDATE TITLE SET TITLE.TITLE = SUBSTRING_INDEX( TITLE.TITLE, ' - ', 1 );
SELECT * FROM TITLE;+----------------------+
| TITLE |
+----------------------+
| Iphigenie auf Tauris |
| Wilhelm Tell |
| Der zerbrochene Krug |
+----------------------+
Das hier vorgestellte Verfahren setzt allerdings voraus, daß kein Titel die Zeichenfolge » - « enthält. Dies zeigt, daß es im allgemeinen von Anfang an vermieden werden sollte, verschiedene Informationen in einer Spalte zu kombinieren. Diese sollte besser von Anfang an auf zwei Spalten aufgeteilt werden.
Anwendungsbeispiel Tabelle auf zwei Tabellen aufteilen
DROP SCHEMA S; CREATE SCHEMA S; USE S;
CREATE TABLE QUELLE ( QUELLE VARCHAR ( 255 ) );
INSERT INTO QUELLE ( QUELLE ) VALUES ( 'Iphigenie auf Tauris - Johann Wolfgang von Goethe' );
INSERT INTO QUELLE ( QUELLE ) VALUES ( 'Wilhelm Tell - Friedrich Schiller' );
INSERT INTO QUELLE ( QUELLE ) VALUES ( 'Der zerbrochene Krug - Heinrich von Kleist' );CREATE TABLE TITEL ( TITEL INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, TEXT VARCHAR ( 255 ) );
CREATE TABLE AUTOR ( AUTOR INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, TEXT VARCHAR ( 255 ) );INSERT INTO TITEL ( TEXT ) SELECT SUBSTRING_INDEX( QUELLE, ' - ', 1 ) FROM QUELLE;
INSERT INTO AUTOR ( TEXT ) SELECT SUBSTRING_INDEX( QUELLE, ' - ', -1 ) FROM QUELLE;
SELECT * FROM TITEL;
+-------+----------------------+
| TITEL | TEXT |
+-------+----------------------+
| 1 | Iphigenie auf Tauris |
| 2 | Wilhelm Tell |
| 3 | Der zerbrochene Krug |
+-------+----------------------+SELECT * FROM AUTOR;
+-------+----------------------------+
| AUTOR | TEXT |
+-------+----------------------------+
| 1 | Johann Wolfgang von Goethe |
| 2 | Friedrich Schiller |
| 3 | Heinrich von Kleist |
+-------+----------------------------+
Übungsaufgabe
Schreiben Sie eine SELECT-Abfrage, welche eine abgeleitete Tabelle ergibt, die nur das erste Wort aus jeder Zeile der Tabelle T enthält.
DROP SCHEMA S; CREATE SCHEMA S; USE S;
CREATE TABLE T ( R VARCHAR ( 255 ) );
INSERT INTO T ( R ) VALUES ( 'Ast Aue' );
INSERT INTO T ( R ) VALUES ( 'Bau Boa' );
INSERT INTO T ( R ) VALUES ( 'Bug Bus' );
INSERT INTO T ( R ) VALUES ( 'Hai Hof' );
INSERT INTO T ( R ) VALUES ( 'Kuh Ohm' );
INSERT INTO T ( R ) VALUES ( 'Uhr Uhu' );
SELECT * FROM T;+---------+
| R |
+---------+
| Ast Aue |
| Bau Boa |
| Bug Bus |
| Hai Hof |
| Kuh Ohm |
| Uhr Uhu |
+---------+
Übungsaufgabe
Schreiben Sie eine SELECT-Abfrage, welche eine abgeleitete Tabelle ergibt, die nur das letzte Wort aus jeder Zeile der Tabelle T enthält.
DROP SCHEMA S; CREATE SCHEMA S; USE S;
CREATE TABLE T ( R VARCHAR ( 255 ) );
INSERT INTO T ( R ) VALUES ( 'Art Ast' );
INSERT INTO T ( R ) VALUES ( 'Axt Bau' );
INSERT INTO T ( R ) VALUES ( 'Box Bug' );
INSERT INTO T ( R ) VALUES ( 'Erz Hai' );
INSERT INTO T ( R ) VALUES ( 'Hut Kuh' );
INSERT INTO T ( R ) VALUES ( 'Ort Uhr' );
SELECT * FROM T;+---------+
| R |
+---------+
| Art Ast |
| Axt Bau |
| Box Bug |
| Erz Hai |
| Hut Kuh |
| Ort Uhr |
+---------+
Übungsaufgabe
Schreiben Sie eine SELECT-Abfrage, welche eine abgeleitete Tabelle ergibt, die nur das mittlere Wort aus jeder Zeile der Tabelle T enthält.
DROP SCHEMA S; CREATE SCHEMA S; USE S;
CREATE TABLE T ( R VARCHAR ( 255 ) );
INSERT INTO T ( R ) VALUES ( 'Art Ast Aue' );
INSERT INTO T ( R ) VALUES ( 'Axt Bau Boa' );
INSERT INTO T ( R ) VALUES ( 'Box Bug Bus' );
INSERT INTO T ( R ) VALUES ( 'Erz Hai Hof' );
INSERT INTO T ( R ) VALUES ( 'Hut Kuh Ohm' );
INSERT INTO T ( R ) VALUES ( 'Ort Uhr Uhu' );
SELECT * FROM T;+-------------+
| R |
+-------------+
| Art Ast Aue |
| Axt Bau Boa |
| Box Bug Bus |
| Erz Hai Hof |
| Hut Kuh Ohm |
| Ort Uhr Uhu |
+-------------+
Zusatzaufgabe
Schreiben Sie eine SELECT-Abfrage, welche eine abgeleitete Tabelle ergibt, die nur das mittlere Wort aus jeder Zeile der Tabelle T enthält.
DROP SCHEMA S; CREATE SCHEMA S; USE S;
CREATE TABLE T ( R VARCHAR ( 255 ) );
INSERT INTO T ( R ) VALUES ( 'Haus Buch Fenster' );
INSERT INTO T ( R ) VALUES ( 'Maschine Woche Werk' );
INSERT INTO T ( R ) VALUES ( 'Tisch Apfel Wind' );
INSERT INTO T ( R ) VALUES ( 'Bild Farbe Bahnhof' );
INSERT INTO T ( R ) VALUES ( 'Kaffee Stern Insel' );
INSERT INTO T ( R ) VALUES ( 'Sofa Getreide Koffer' );
SELECT * FROM T;