none
Consulta: Separar parte de un string en varias filas RRS feed

  • Pregunta

  • Hola, muchas gracias de antemano por su ayuda. 

    Tengo una tabla con un campo que se llama numero y otro que se llama observacion  y tiene contenidos como estos:

    numero           observacion

    112                bla bla bla *896

    113                observacion de ejemplo *897, *898, *899 y más texto....

    114                puro texto sin numeros con asteriscos

    115                bla bla *910

    Quisiera poder hacer un Select que me traiga algo como esto:

    numero             asteriscos

    112                   896

    113                   897

    113                   898

    113                   899

    115                   910

    ¿Me podrían decir por favor cómo hacerlo? Gracias

    domingo, 23 de septiembre de 2018 9:06

Respuestas

  • Hola Vicenzo Caschetto:

    Puedes hacer algo como esto.

    -- Erland's split_me
    CREATE FUNCTION [dbo].[ufn_inline_split_me](@param nvarchar(MAX), @delimiter nchar(1) = N',')
    RETURNS table AS
    RETURN (
    SELECT
        ROW_NUMBER() OVER(ORDER BY n) AS pos,
        LTRIM(RTRIM(CONVERT(nvarchar(4000),
            SUBSTRING(@param, n,
                CHARINDEX(@delimiter COLLATE Slovenian_BIN2, @param + CONVERT(nvarchar(MAX), @delimiter), n) - n)))) AS Value
    FROM
        dbo.ufn_GetNums(1, LEN(@param))
    WHERE
        SUBSTRING(CONVERT(nvarchar(MAX), @delimiter) + @param, n, 1) = @delimiter COLLATE Slovenian_BIN2
    );
    GO
    


    Una vez tengas creada esta función.

    DECLARE @T TABLE
    (numero      INT,
     observacion VARCHAR(512)
    );
    INSERT INTO @T
    (numero,
     observacion
    )
    VALUES
    (112,
     'bla bla bla *896'
    ),
    (113,
     'observacion de ejemplo *897, *898, *899 y más texto....'
    ),
    (114,
     'puro texto sin numeros con asteriscos'
    ),
    (115,
     'bla bla *910'
    );
    SELECT o.numero,
           CASE
               WHEN PATINDEX('%[^0-9]%', o.observacion) = 0
               THEN o.observacion
               ELSE SUBSTRING(o.observacion, 1, PATINDEX('%[^0-9]%', o.observacion)-1)
           END AS observacion
    FROM
    (
        SELECT T.NUMERO,
               CASE
                   WHEN SUBSTRING(S.Value, 1, 1) LIKE '[0-9]'
                   THEN S.VALUE
               END AS observacion
        FROM @T AS T
             OUTER APPLY dbo.ufn_inline_split_me(T.observacion, N'*') AS S
    ) AS o
    WHERE NOT observacion IS NULL;
    GO

    Salida:

    Si dispones de Sql Server 2016 o superior, puedes de un modo más facil utilizar split

    Un saludo

    lunes, 24 de septiembre de 2018 0:55