Muchas veces, las consultas T-SQL no son sólo para compilar enormes conjuntos de cálculos agregados o uniones avanzadas y estrategias de indexación. A veces, necesitas las habilidades y herramientas para hacer un poco de análisis básico de cadenas. Aquí, aprenderá el análisis básico de cadenas más común y las funciones que se encuentran en T-SQL.
Algunas de las funciones de cadenas más utilizadas son las funciones LEFT() y RIGHT() junto con SUBSTRING(). LEFT(a, n) devuelve los primeros «n» caracteres de «a», tal y como se esperaría en, por ejemplo, Basic o muchos otros lenguajes de programación. RIGHT(a, n) funciona de la misma manera, pero la cadena devuelta está a «n» caracteres del final. SUBSTRING(a, offset, length) se corresponde con la función Mid() de VisualBasic: devuelve los caracteres de «longitud» de «a», empezando por «offset». LEN() devuelve la longitud de una cadena.
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);
Encontrar un carácter o un comodín
Básicamente hay dos funciones diferentes para encontrar una cadena de caracteres o un comodín en T-SQL, CHARINDEX() y PATINDEX(). Funcionan prácticamente igual, pero la diferencia es que CHARINDEX(s, a) devuelve el primer desplazamiento de la cadena de caracteres «s» en «a», mientras que PATINDEX(s, a) devuelve el primer desplazamiento donde el comodín «s» es verdadero en «a». Los comodines utilizan la misma sintaxis que se aplicaría en una cláusula LIKE. Para ambas funciones, el valor de retorno 0 significa que no hubo coincidencia.
DECLARE @str varchar(100);SET @str='Another brown fox jumps over something';SELECT CHARINDEX('fox', @str), PATINDEX('%jump%', @str);
Dividir un valor de cadena
Eso es básicamente todo lo que necesitas para dividir una cadena en, digamos, palabras.
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;
Lo que hace la consulta anterior es:
- Bucle hasta que @str esté en blanco.
- Busca el siguiente espacio (fíjate en el @str+’ ‘. Esto para que encontremos la última palabra, ¡que no tiene espacio final!)
- Selecciona todo lo que está a la izquierda de @offset (estamos usando @offset-1, para no incluir el espacio en sí)
- Truncando el principio de @str con caracteres @offset+1 (para incluir el espacio).
- Cuando hayamos truncado la última palabra de @str, la variable estará en blanco y el bucle se detendrá.
… o con una CTE recursiva
Si quieres puntos extra por delicadeza, utiliza una expresión de tabla común 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;
Las expresiones recursivas de tabla común son el tema de otro post.