Muitas vezes, as consultas T-SQL não são apenas para compilar enormes conjuntos de cálculos agregados ou estratégias avançadas de junção e indexação. Por vezes, são necessárias competências e ferramentas para fazer a análise básica de cadeias de caracteres. Aqui, aprenderá a análise básica mais comum de strings e funções encontradas em T-SQL.
Algumas das funções de strings mais comummente utilizadas são as funções LEFT() e RIGHT() juntamente com SUBSTRING(). LEFT(a, n) retorna os primeiros caracteres “n” de “a”, tal como seria de esperar em, digamos, Basic ou muitas outras linguagens de programação. RIGHT(a, n) funciona da mesma forma, mas a cadeia de caracteres retornada é “n” caracteres do final. SUBSTRING(a, offset, comprimento) corresponde à função VisualBasic Mid() – devolve caracteres “comprimento” de “a”, começando em “offset”. LEN() retorna o comprimento de uma string.
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);
Finding a character or a wildcard
Existem basicamente duas funções diferentes para encontrar uma string de caracteres ou um wildcard em T-SQL, CHARINDEX() e PATINDEX(). Funcionam praticamente da mesma forma, mas a diferença é que CHARINDEX(s, a) devolve o primeiro desvio da cadeia de caracteres “s” em “a”, enquanto que PATINDEX(s, a) devolve o primeiro desvio onde o curinga “s” é verdadeiro em “a”. Os wildcards utilizam a mesma sintaxe que se aplicaria numa cláusula de LIKE. Para ambas as funções, o valor de retorno 0 significa que não houve correspondência.
DECLARE @str varchar(100);SET @str='Another brown fox jumps over something';SELECT CHARINDEX('fox', @str), PATINDEX('%jump%', @str);
Dividir um valor de string
É basicamente tudo o que precisa para dividir uma string em, digamos, palavras.
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;
O que a consulta acima faz é:
- Loop até @str estar em branco.
- Loop até @str estar em branco.
Loop até @str estar em branco.Loop até @str estar em branco.Loop até @str estar em branco.Loop até @str estar em branco.Loop até @str+’ ‘. Isto para que encontremos a última palavra, que não tem um espaço de fuga!)li>SELECT tudo à esquerda de @offset (estamos a usar @offset-1, para não incluirmos o espaço em si)li>Truncando o início de @str com @offset+1 (para incluir o espaço) caracteres.li>Quando truncamos a última palavra de @str, a variável ficará em branco e o laço parará.
… ou com um CTE recursivo
Se quiser pontos extra para fineza, use uma expressão de tabela comum recursiva.
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;
Expressões de tabelas comuns recursivas são o tópico de um post diferente.