top of page

Quebrar coluna com delimitador - SQL Server

Não sei se este é o nome mais adequado mas segue o exemplo:


Tenho uma tabela que contem uma coluna que tem várias informações em uma única coluna e existe um delimitador de texto entre eles.


Veja que depois de Produto ou Plano existe o delimitador >>


Neste exemplo, meu objetivo é extrair as três primeiras para fazer a quebra de informações e elaborar um dashboard.




SELECT
    -- Primeira coluna: Texto antes do primeiro ">>", se existir
    CASE 
        WHEN CHARINDEX('>>', assunto) > 0 
        THEN LTRIM(RTRIM(SUBSTRING(assunto, 1, CHARINDEX('>>', assunto) - 1)))
        ELSE LTRIM(RTRIM(assunto))
    END AS coluna1,

    -- Segunda coluna: Texto entre o primeiro e o segundo ">>", se existir
    CASE 
        WHEN CHARINDEX('>>', assunto) > 0 
             AND CHARINDEX('>>', assunto, CHARINDEX('>>', assunto) + 2) > 0
        THEN LTRIM(RTRIM(SUBSTRING(
            assunto,
            CHARINDEX('>>', assunto) + 2,
            CHARINDEX('>>', assunto, CHARINDEX('>>', assunto) + 2) - CHARINDEX('>>', assunto) - 2
        )))
        ELSE NULL
    END AS coluna2,

    -- Terceira coluna: Texto entre o segundo e o terceiro ">>", se existir
    CASE 
        WHEN CHARINDEX('>>', assunto, CHARINDEX('>>', assunto) + 2) > 0 
             AND CHARINDEX('>>', assunto, CHARINDEX('>>', assunto, CHARINDEX('>>', assunto) + 2) + 2) > 0
        THEN LTRIM(RTRIM(SUBSTRING(
            assunto,
            CHARINDEX('>>', assunto, CHARINDEX('>>', assunto) + 2) + 2,
            CHARINDEX('>>', assunto, CHARINDEX('>>', assunto, CHARINDEX('>>', assunto) + 2) + 2) - CHARINDEX('>>', assunto, CHARINDEX('>>', assunto) + 2) - 2
        )))
        ELSE LTRIM(RTRIM(SUBSTRING(
            assunto,
            CHARINDEX('>>', assunto, CHARINDEX('>>', assunto) + 2) + 2,
            LEN(assunto)
        )))
    END AS coluna3

FROM baseansnip;


Resultado:


bottom of page