Manejo de Strings en SQL Server
“¿Cómo podría separar un campo SQL por un delimitador?”, “¿Cómo podría quedarme con la primera palabra de un campo SQL?”, “¿Cómo podría obtener las primeras tres letras de un campo SQL? ¿Y las últimas tres?”, “¿Cómo podría unir variables de tipo String?”

Estas son todas preguntas que quizás te hayas hecho si usás seguido SQL Server. Vamos a tratar de responderlas todas en este post.
Separar un campo String por Delimitador en SQL Server
En caso de que necesites separar un campo String por un Delimitador, STRING_SPLIT es tu función. Si tu valor es fijo, podrías hacer algo así:
SELECT value FROM STRING_SPLIT('a-b-c-d-e','-');
Ahora digamos que querés contar monedas:
SELECT value,count(*) FROM STRING_SPLIT('a-b-c-d-e-a-b-c-e-e','-') GROUP BY value;
Esto es útil si tu string es fijo… ¿pero qué pasa si no lo es? Digamos que tenés un nombre y un segundo nombre en el mismo String y querés separarlos, ¿cómo lo harías?
Acá es donde SUBSTRING, CHARINDEX, y LEN vienen a tu rescate:
SELECT SUBSTRING([name],1,CHARINDEX(' ',[name],1)) AS First_Name, SUBSTRING([name], CHARINDEX(' ',[name],1)+1, LEN([name])) AS Middle_Name FROM [Test].[dbo].[test];
¿Y si tengo en una tabla campos string como este ‘a-b-c-d-e’ y quiero separar cada uno de ellos?
Bueno, acá se complica, el mejor enfoque sería convertir los strings a formato XML y separarlos por un delimitador, así:
DECLARE @Delimiter CHAR = '-'
SELECT LTRIM(RTRIM(Split.a.value('.', 'VARCHAR(100)'))) 'Value'
FROM
(
SELECT CAST ('<M>' + REPLACE([name], @Delimiter, '</M><M>') + '</M>' AS XML) AS Data
FROM [Test].[dbo].[test]
) AS A
CROSS APPLY Data.nodes ('/M') AS Split(a)
¿Cómo podría quedarme con la primera palabra de un campo SQL?
Acá podríamos usar SUBSTRING y CHARINDEX como hicimos antes.
SELECT SUBSTRING([name],1,CHARINDEX(' ',[name],1)) AS First_Name FROM [Test].[dbo].[test]
Esto te va a dar el First Name pero hay una trampa, ¿qué pasa si el String no tiene un espacio (el usuario no tiene segundo nombre)?
En este caso, también podríamos usar un CASE WHEN para determinar si hay un espacio o no, tu consulta va a quedar más o menos así:
SELECT SUBSTRING([name],1,CASE WHEN CHARINDEX(' ',[name],1)!= 0 THEN CHARINDEX(' ',[name],1) ELSE LEN([name]) END) FROM [Test].[dbo].[test]
Como ya sabrás, a medida que los datos se vuelven más extensos, nuestras consultas para determinar lo que necesitamos también se van a volver más complicadas porque vamos a tener que considerar distintas situaciones.
¿Cómo podría obtener las primeras tres letras de un campo SQL? ¿Y las últimas tres?
Usando LEFT y RIGHT vamos a llegar:
SELECT RIGHT([name],3) FROM [Test].[dbo].[test]; /* Nos va a dar las primeras tres letras */
SELECT RIGHT([name],3) FROM [Test].[dbo].[test]; /* Nos va a dar las últimas tres letras */
¿Y si queremos todo el texto EXCEPTO las primeras letras o las últimas letras? Vimos antes cómo usar SUBSTRING y LEN, podríamos combinarlos acá:
SELECT SUBSTRING([name],4,LEN([name])) FROM [Test].[dbo].[test]; /* Nos va a dar todo excepto las primeras tres letras */
SELECT SUBSTRING([name],1,LEN([name])-3) FROM [Test].[dbo].[test]; /* Nos va a dar todo excepto las últimas tres letras */
¿Cómo podría unir variables de tipo String?
Si estás tratando de unir distintas columnas de la misma fila, podríamos usar CONCAT acá.
SELECT CONCAT([name],' ',[lastname]) as FullName FROM [Test].[dbo].[test]
En caso de que quieras unir la misma columna de distintas filas (o cualquier otra), se puede poner un poco complicado, pero algo así podría funcionar:
SELECT CONCAT([a].[first_row_name],';',[b].[second_row_name]) FROM
(SELECT T.* FROM (SELECT ROW_NUMBER() OVER (ORDER by name ASC) as tmpId, [name] as first_row_name FROM [Test].[dbo].[test]) T WHERE T.tmpId=1) a
LEFT JOIN
(SELECT T.* FROM (SELECT ROW_NUMBER() OVER (ORDER by name ASC) as tmpId, [name] as [second_row_name] FROM [Test].[dbo].[test]) T WHERE T.tmpId=2) b
on a.tmpId=1 and b.tmpId=2
Conclusión
Manejar Strings en SQL Server no es tan fácil como parece, si tus tablas son simples, probablemente vas a tener menos problemas manejándolos, pero, como pudiste ver, a medida que tus datos empiezan a volverse más complejos, tus consultas también se van a tener que volver más complicadas.
Espero que encuentres útil este tutorial, quizás también podrías aprender más sobre SQL Server en este post.
¡Nos vemos en la próxima ronda!