¿Cómo divido una cadena delimitada para poder acceder a elementos individuales?
Usando SQL Server, ¿cómo divido una cadena para poder acceder al elemento x?
Tome una cadena "Hola John Smith". ¿Cómo puedo dividir la cadena por espacio y acceder al elemento en el índice 1 que debería devolver "John"?
No creo que SQL Server tenga una función de división incorporada, por lo que, aparte de una UDF, la única otra respuesta que conozco es secuestrar la función PARSENAME:
SELECT PARSENAME(REPLACE('Hello John Smith', ' ', '.'), 2)
PARSENAME toma una cadena y la divide en el carácter de punto. Toma un número como segundo argumento, y ese número especifica qué segmento de la cadena devolver (trabajando de atrás hacia adelante).
SELECT PARSENAME(REPLACE('Hello John Smith', ' ', '.'), 3) --return Hello
El problema obvio es cuando la cadena ya contiene un punto. Sigo pensando que usar una UDF es la mejor manera... ¿alguna otra sugerencia?
Puede encontrar útil la solución en Función definida por el usuario de SQL para analizar una cadena delimitada (de The Code Project ).
Puedes usar esta lógica simple:
Declare @products varchar(200) = '1|20|3|343|44|6|8765'
Declare @individual varchar(20) = null
WHILE LEN(@products) > 0
BEGIN
IF PATINDEX('%|%', @products) > 0
BEGIN
SET @individual = SUBSTRING(@products,
0,
PATINDEX('%|%', @products))
SELECT @individual
SET @products = SUBSTRING(@products,
LEN(@individual + '|') + 1,
LEN(@products))
END
ELSE
BEGIN
SET @individual = @products
SET @products = NULL
SELECT @individual
END
END