---
title: "Manejo de Strings en SQL Server"
slug: "handling-strings-in-sql-server"
published_at: "2022-10-17T21:48:42.000Z"
categories: "SQL Avanzado, Tutoriales de SQL, Tutoriales de SQL para principiantes, Transact-SQL"
tags: "delimitadores, Manejo, join, left, len, right, dividir, SQL Server, string_split, Cadenas de texto, substring"
---

# 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?”

**“¿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?”**

![](/blog/handling-strings-in-sql-server/image-15-1024x456.png)

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**](https://learn.microsoft.com/en-us/sql/t-sql/functions/string-split-transact-sql?view=sql-server-ver16) es tu función. Si tu valor es fijo, podrías hacer algo así:

```sql
SELECT value FROM STRING_SPLIT('a-b-c-d-e','-');
```

Ahora digamos que querés contar monedas:

```sql
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](https://learn.microsoft.com/en-us/sql/t-sql/functions/substring-transact-sql?view=sql-server-ver16)**, **[CHARINDEX](https://learn.microsoft.com/en-us/sql/t-sql/functions/charindex-transact-sql?view=sql-server-ver16),** y **[LEN](https://learn.microsoft.com/en-us/sql/t-sql/functions/len-transact-sql?view=sql-server-ver16)** vienen a tu rescate:

```sql
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í:

```sql
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](https://learn.microsoft.com/en-us/sql/t-sql/functions/substring-transact-sql?view=sql-server-ver16)** y **[CHARINDEX](https://learn.microsoft.com/en-us/sql/t-sql/functions/charindex-transact-sql?view=sql-server-ver16)** como hicimos antes.

```sql
 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](https://learn.microsoft.com/en-us/sql/t-sql/language-elements/case-transact-sql?view=sql-server-ver16)** para determinar si hay un espacio o no, tu consulta va a quedar más o menos así:

```sql
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](https://learn.microsoft.com/en-us/sql/t-sql/functions/left-transact-sql?view=sql-server-ver16)** y **[RIGHT](https://learn.microsoft.com/en-us/sql/t-sql/functions/right-transact-sql?view=sql-server-ver16)** vamos a llegar:

```sql
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á:

```sql
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](https://learn.microsoft.com/en-us/sql/t-sql/functions/concat-transact-sql?view=sql-server-ver16)** acá.

```sql
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:

```sql

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](/es/how-to-use-a-qualify-clause-in-sql).

¡Nos vemos en la próxima ronda!

