Wiele razy zapytania T-SQL nie służą tylko do kompilacji ogromnych zestawów obliczeń zbiorczych lub zaawansowanych złączeń i strategii indeksowania. Czasami potrzebujesz umiejętności i narzędzi, aby wykonać podstawowe parsowanie ciągów znaków. Tutaj poznasz najczęściej spotykane podstawowe parsowanie ciągów znaków i funkcje występujące w T-SQL.
Najczęściej używanymi funkcjami ciągów znaków są funkcje LEFT() i RIGHT() wraz z SUBSTRING(). LEFT(a, n) zwraca pierwsze „n” znaków „a”, tak jak można by się tego spodziewać w Basicu lub wielu innych językach programowania. RIGHT(a, n) działa w ten sam sposób, ale zwracany łańcuch ma „n” znaków od końca. SUBSTRING(a, offset, długość) odpowiada funkcji VisualBasic Mid() – zwraca „długość” znaków z „a”, zaczynając od „offsetu”. LEN() zwraca długość łańcucha znaków.
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);
Znajdowanie znaku lub symbolu wieloznacznego
W T-SQL istnieją w zasadzie dwie różne funkcje do znajdowania łańcucha znaków lub symbolu wieloznacznego, CHARINDEX() i PATINDEX(). Działają one prawie tak samo, ale różnica polega na tym, że CHARINDEX(s, a) zwraca pierwsze przesunięcie łańcucha znaków „s” w „a”, podczas gdy PATINDEX(s, a) zwraca pierwsze przesunięcie, gdzie symbol wieloznaczny „s” jest prawdziwy w „a”. Znaki wieloznaczne używają tej samej składni, jaką zastosowałbyś w klauzuli LIKE. Dla obu funkcji, wartość zwracana 0 oznacza, że nie było dopasowania.
DECLARE @str varchar(100);SET @str='Another brown fox jumps over something';SELECT CHARINDEX('fox', @str), PATINDEX('%jump%', @str);
Podzielenie wartości łańcuchowej
To w zasadzie wszystko, czego potrzebujesz, aby podzielić łańcuch na, powiedzmy, słowa.
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;
To co robi powyższe zapytanie to:
- Pętla aż @str będzie pusty.
- Znajdź następną spację (zauważ @str+' '. Dzięki temu znajdziemy ostatnie słowo, które nie posiada końcowej spacji!)
- Wybierz wszystko na lewo od @offset (używamy @offset-1, więc nie uwzględniamy samej spacji)
- Obcinanie początku @str znakami @offset+1 (aby uwzględnić spację).
- Gdy obetniemy ostatnie słowo z @str, zmienna będzie pusta i pętla się zatrzyma.
… lub z rekursywnym CTE
Jeśli chcesz uzyskać dodatkowe punkty za finezję, użyj rekursywnego wspólnego wyrażenia tablicowego.
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;
Rekursywne wspólne wyrażenia tabelaryczne są tematem innego postu.