Articles

Basic string parsing

Posted on

Molte volte, le query T-SQL non sono solo per compilare enormi set di calcoli aggregati o join avanzati e strategie di indicizzazione. A volte, avete bisogno delle competenze e degli strumenti per fare un po’ di analisi di base delle stringhe. Qui imparerete l’analisi di base delle stringhe e le funzioni più comuni che si trovano in T-SQL.

Alcune delle funzioni di stringa più comunemente usate sono le funzioni LEFT() e RIGHT() insieme a SUBSTRING(). LEFT(a, n) restituisce i primi “n” caratteri di “a”, proprio come ci si aspetta in, diciamo, Basic o in molti altri linguaggi di programmazione. RIGHT(a, n) funziona allo stesso modo, ma la stringa restituita è a “n” caratteri dalla fine. SUBSTRING(a, offset, lunghezza) corrisponde alla funzione Mid() di VisualBasic – restituisce i caratteri di “lunghezza” da “a”, partendo da “offset”. LEN() restituisce la lunghezza di una stringa.

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);

Trovare un carattere o un carattere jolly

Ci sono fondamentalmente due diverse funzioni per trovare una stringa di caratteri o un carattere jolly in T-SQL, CHARINDEX() e PATINDEX(). Funzionano più o meno allo stesso modo, ma la differenza è che CHARINDEX(s, a) restituisce il primo offset della stringa di caratteri “s” in “a”, mentre PATINDEX(s, a) restituisce il primo offset dove il carattere jolly “s” è vero in “a”. I caratteri jolly usano la stessa sintassi che applichereste in una clausola LIKE. Per entrambe le funzioni, il valore di ritorno 0 significa che non c’è stata alcuna corrispondenza.

DECLARE @str varchar(100);SET @str='Another brown fox jumps over something';SELECT CHARINDEX('fox', @str), PATINDEX('%jump%', @str);

Splitting a string value

Questo è fondamentalmente tutto ciò di cui avete bisogno per dividere una stringa in, diciamo, parole.

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;

Quello che la query di cui sopra fa è:

  • Love fino a quando @str è vuoto.
  • Trova il prossimo spazio (nota il @str+’ ‘. Questo per trovare l’ultima parola, che non ha uno spazio finale!)
  • Selezionare tutto ciò che si trova a sinistra di @offset (stiamo usando @offset-1, quindi non includiamo lo spazio stesso)
  • Troncare l’inizio di @str con @offset+1 (per includere lo spazio) caratteri.
  • Quando abbiamo troncato l’ultima parola da @str, la variabile sarà vuota e il ciclo si fermerà.

… o con un CTE ricorsivo

Se volete punti extra per la finezza, usate un’espressione di tabella comune ricorsiva.

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;

Le espressioni ricorsive di tabella comune sono l’argomento di un altro post.

Condividi:

Stampa

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *