Vaak zijn T-SQL queries niet alleen bedoeld voor het samenstellen van enorme reeksen aggregate berekeningen of geavanceerde joins en indexeer strategieën. Soms heb je de vaardigheden en gereedschappen nodig om wat basis string parsing te doen. Hier leer je de meest voorkomende string parsing en functies in T-SQL.
De meest gebruikte string functies zijn de LEFT() en RIGHT() functies samen met SUBSTRING(). LEFT(a, n) geeft de eerste “n” tekens van “a” weer, net zoals je zou verwachten in bijvoorbeeld Basic of veel andere programmeertalen. RIGHT(a, n) werkt op dezelfde manier, maar de geretourneerde tekenreeks is “n” tekens vanaf het einde. SUBSTRING(a, offset, length) komt overeen met de VisualBasic functie Mid() – het retourneert “lengte” tekens vanaf “a”, beginnend bij “offset”. LEN() geeft de lengte van een string terug.
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);
Een teken of een jokerteken vinden
Er zijn in principe twee verschillende functies voor het vinden van een tekenreeks of een jokerteken in T-SQL, CHARINDEX() en PATINDEX(). Ze werken vrijwel hetzelfde, maar het verschil is dat CHARINDEX(s, a) de eerste offset van de tekenreeks “s” in “a” teruggeeft, terwijl PATINDEX(s, a) de eerste offset teruggeeft waar het jokerteken “s” waar is in “a”. Wildcards gebruiken dezelfde syntaxis als je zou toepassen in een LIKE-clausule. Voor beide functies betekent de retourwaarde 0 dat er geen overeenkomst was.
DECLARE @str varchar(100);SET @str='Another brown fox jumps over something';SELECT CHARINDEX('fox', @str), PATINDEX('%jump%', @str);
Een tekenreeks waarde splitsen
Dat is in principe alles wat je nodig hebt om een tekenreeks te splitsen in, bijvoorbeeld, woorden.
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;
Wat de bovenstaande query doet is:
- Loop totdat @str leeg is.
- Zoek de volgende spatie (let op de @str+’ ‘. Dit zodat we het laatste woord vinden, dat geen spatie achteraan heeft!)
- SELECTEER alles links van @offset (we gebruiken @offset-1, dus we tellen de spatie zelf niet mee)
- Beknoei het begin van @str met @offset+1 (om de spatie mee te rekenen) tekens.
- Wanneer we het laatste woord uit @str hebben beknopt, zal de variabele leeg zijn en de lus stoppen.
… of met een recursieve CTE
Als je extra punten wilt voor finesse, gebruik dan een recursieve gemeenschappelijke tabel expressie.
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;
Recursieve gemeenschappelijke tabeluitdrukkingen zijn het onderwerp van een andere post.