Viele Male sind T-SQL-Abfragen nicht nur dazu da, riesige Mengen von Aggregatberechnungen oder fortgeschrittene Joins und Indexierungsstrategien zu erstellen. Manchmal braucht man die Fähigkeiten und Werkzeuge, um ein paar grundlegende String-Parsing durchzuführen. Hier lernen Sie die gebräuchlichsten grundlegenden String-Parser und Funktionen in T-SQL kennen.
Zu den am häufigsten verwendeten String-Funktionen gehören die Funktionen LEFT() und RIGHT() sowie SUBSTRING(). LEFT(a, n) gibt die ersten „n“ Zeichen von „a“ zurück, so wie Sie es z. B. in Basic oder vielen anderen Programmiersprachen erwarten würden. RIGHT(a, n) funktioniert auf die gleiche Weise, aber die zurückgegebene Zeichenkette ist „n“ Zeichen vom Ende entfernt. SUBSTRING(a, offset, length) entspricht der VisualBasic-Funktion Mid() – sie gibt „length“ Zeichen von „a“ zurück, beginnend bei „offset“. LEN() gibt die Länge einer Zeichenkette zurück.
DECLARE @str varchar(100);SET @str='Another brown fox jumps over something';SELECT LEFT(@str, 7), SUBSTRING(@str, 15, 3), RIGHT(@str, 9), LEN(@str);
Ein Zeichen oder einen Platzhalter finden
Es gibt grundsätzlich zwei verschiedene Funktionen zum Finden einer Zeichenkette oder eines Platzhalters in T-SQL, CHARINDEX() und PATINDEX(). Sie funktionieren ziemlich gleich, aber der Unterschied ist, dass CHARINDEX(s, a) den ersten Offset der Zeichenkette „s“ in „a“ zurückgibt, während PATINDEX(s, a) den ersten Offset zurückgibt, bei dem der Platzhalter „s“ in „a“ wahr ist. Für Platzhalter wird die gleiche Syntax verwendet, die Sie auch in einer LIKE-Klausel verwenden würden. Für beide Funktionen bedeutet der Rückgabewert 0, dass es keine Übereinstimmung gab.
DECLARE @str varchar(100);SET @str='Another brown fox jumps over something';SELECT CHARINDEX('fox', @str), PATINDEX('%jump%', @str);
Splitten eines Zeichenkettenwerts
Das ist im Grunde alles, was Sie brauchen, um eine Zeichenkette in, sagen wir, Wörter zu zerlegen.
DECLARE @str varchar(100), @offset int;SET @str='Another brown fox jumps over something';WHILE (@str!='') BEGIN; SET @offset=CHARINDEX(' ', @str+' '); SELECT LEFT(@str, @offset-1); SET @str=SUBSTRING(@str, @offset+1, LEN(@str));END;
Was die obige Abfrage macht, ist:
- Schleife, bis @str leer ist.
- Finden Sie das nächste Leerzeichen (beachten Sie das @str+‘ ‚. So finden wir das letzte Wort, das kein Leerzeichen am Ende hat!)
- Auswählen von allem, was links von @offset steht (wir verwenden @offset-1, damit wir das Leerzeichen selbst nicht einschließen)
- Abschneiden des Anfangs von @str mit @offset+1 (um das Leerzeichen einzuschließen) Zeichen.
- Wenn wir das letzte Wort von @str abgeschnitten haben, ist die Variable leer und die Schleife endet.
… oder mit einer rekursiven CTE
Wenn Sie Extrapunkte für Finesse wollen, verwenden Sie einen rekursiven Common Table Expression.
DECLARE @str varchar(100), @offset int;SET @str='Another brown fox jumps over something';WITH words (word, str_remain)AS ( --- Anchor part SELECT CAST(NULL AS varchar(100)) AS word, @str AS str_remain UNION ALL --- Recursion SELECT LEFT(str_remain, CHARINDEX(' ', str_remain+' ')-1) AS word, SUBSTRING(str_remain, CHARINDEX(' ', str_remain+' ')+1, LEN(str_remain)) AS str_remain FROM words WHERE str_remain!='')SELECT wordFROM wordsWHERE word IS NOT NULL;
Rekursive allgemeine Tabellenausdrücke sind das Thema eines anderen Beitrags.