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.
Segue base de dados utilizada: https://dadosabertos.ans.gov.br/FTP/PDA/demandas_dos_consumidores_nip/
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: