¿Cómo divido una cadena delimitada para poder acceder a elementos individuales?

Resuelto GateKiller asked hace 16 años • 46 respuestas

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"?

GateKiller avatar Aug 06 '08 01:08 GateKiller
Aceptado

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?

Nathan Bedford avatar Aug 05 '2008 18:08 Nathan Bedford

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
Jonesinator avatar Aug 05 '2008 18:08 Jonesinator