Función String_split SQL Server

Usando la Función String_split

Microsoft SQL Server en la versión 2017 ha incluído algunas funciones interesantes para el manejo de cadenas de texto, una de ellas es la función String_agg, la que permitía convertir un conjunto de valores de cadena a una cadena separada por un caracter. En este artículo se explica como se usa la función String_Split que hace lo inverso de la función String_agg.
Ver Función String_agg

Nivel de compatibilidad necesario

Para poder usar la función String_split es necesario el nivel de compatibilidad mínimo de 130, que corresponde a SQL Server 2016.
Ver Compatibilidad de base de datos en SQL Server

Función String_split

Es una función de valor de tabla que separa una cadena de caracteres en partes basado en un separador.

Sintaxis
String_split(Cadena, Separador)
Donde
Cadena
Es la cadena de caracteres a separar
Separador
Caracter que se usa como base para separar. El caracter es simple y puede ser nvarchar(1), varchar(1), nchar(1) o char(1)

La imagen ilustra el resultado de la función String_split

Ejercicios

Ejercicio 1

Convertir los nombres en un valor de columna
Declare @Personal nvarchar(100) = ‘Carolina, Maria Fernanda, Aracely, Esmeralda, Rossana, Silvia’
Select value from String_split(Replace(@Personal,’, ‘,’,’),’,’) As Personas
go
El resultado se muestra en la siguiente imagen

Ejercicio 2

Convertir los Productos en un valor de columna
Declare @Productos nvarchar(100) = ‘Monitor, Teclado, Mouse, Disco duro, Impresora, UPS, Scanner’
Select value from String_split(Replace(@Productos,’, ‘,’,’),’,’)
go
El resultado se muestra en la siguiente imagen

Usando la base de datos Northwind
use Northwind
go

Ejercicio 3

Crear una vista con las categorías y sus productos separados por coma. Esta vista se va a usar para luego presentar los productos de cada una de las categorías como una columna.

Create view vistaCategoriasProductosComa
As
select C.CategoryID As ‘Código’,
C.CategoryName As ‘Categoría’,
Productos = STRING_AGG(P.ProductName,’,’)
within group (order by P.ProductName asc)
from Categories As C
join Products As P on C.CategoryID = P.CategoryID
group by C.CategoryID, C.CategoryName
go

Los registros en la vista
select * from vistaCategoriasProductosComa
go
El resultado se muestra en la siguiente imagen

Ahora vamos a separar los productos cada uno en filas.

select V.Código, V.Categoría, value As Producto
from vistaCategoriasProductosComa As V
cross apply string_split(V.Productos,’,’)
go
Ver Cross Apply en SQL Server
El resultado se muestra en la siguiente imagen

Obtener solamente los productos
select value As Producto
from vistaCategoriasProductosComa As V
cross apply string_split(V.Productos,’,’)
go
El resultado se muestra en la siguiente imagen

Ordenamiento de los valores

Al aplicar el ordenamiento de valores obtenidos de una cadena separada por coma, debe considerar que a partir del segundo valor puede contener un espacio en blanco, se debe eliminar el espacio en blanco usando la función Replace para reemplazar los caracteres ‘, ‘ (coma y espacio) por solamente la coma.

Ejercicio 4

Listar los productos ordenados en forma ascendente.
Declare @Productos nvarchar(100) = ‘Monitor, Teclado, Mouse, Disco duro, Impresora, UPS, Scanner’
Select rtrim(value) As Productos from String_split(Replace(@Productos,’, ‘,’,’),’,’)
order by value
go
El resultado se muestra en la siguiente imagen

Filtrando los valores

Para realizar el filtrado de los valores usando el campo con los valores a separar, se usar la palabra reservada Value para hacer referencia al conjunto de valores.

Ejercicio 5

Para mostrar los productos que inician con la letra M.
Declare @Productos nvarchar(100) = ‘Monitor, Teclado, Mouse, Disco duro, Impresora, UPS, Scanner’
Select rtrim(value) from String_split(Replace(@Productos,’, ‘,’,’),’,’)
where Upper(value) like ‘M%’
order by value
go
El resultado se muestra en la siguiente imagen

Ejercicio 6

Mostrar los productos que inician con las letras C, F y M
select V.Código, V.Categoría, value As Producto
from vistaCategoriasProductosComa As V
cross apply string_split(V.Productos,’,’)
where upper(value) like ‘C%’ or upper(value) like ‘F%’ or
upper(value) like ‘M%’
Order by value
go
Ver Cross Apply en SQL Server
El resultado se muestra en la siguiente imagen

Evitando valores en blanco

Al generar la lista de valores puede que algunos de ellos no tengan datos, puede evitarse posiblemente de acuerdo a las reglas de negocio usando restriciones de tipo Default.
Ver Usando Restricciones en SQL Server

Ejercicio 7

Listado de productos, algunos con valores en blanco.
Declare @Productos nvarchar(100) = ‘Monitor, Teclado, , , Mouse, Disco duro, , , Impresora, UPS, Scanner’
Select rtrim(value) from String_split(Replace(@Productos,’, ‘,’,’),’,’)
go
El resultado se muestra en la siguiente imagen

Evitando los valores en blanco.
Declare @Productos nvarchar(100) = ‘Monitor, Teclado, , , Mouse, Disco duro, , , Impresora, UPS, Scanner’
Select rtrim(value) from String_split(Replace(@Productos,’, ‘,’,’),’,’)
where RTRIM(value) <> »
go
El resultado se muestra en la siguiente imagen

Generar una tabla con los valores obtenidos con String_Split

Se puede usar la opción Into de la instrucción Select para generar una tabla con los valores obtenidos usando String_split

Ejercicio 8

Crear una tabla con los productos de la categoría 3, usando la vista creada en el ejercicio 3.
select value As Producto
into ProductosCategoria3
from vistaCategoriasProductosComa As V
cross apply string_split(V.Productos,’,’)
where v.Código = 3
go
Ver los productos
select * from ProductosCategoria3
go
El resultado se muestra en la siguiente imagen