Articles

Podstawowe parsowanie ciągów znaków

Posted on

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.

Podziel się:

Drukuj

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *