Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Concatenar informações separadas por vírgula.

Pessoal, bom dia. Tenho uma tabela com as seguintes informações:

SEQBOLETOAVISO1AVISO2AVISO3AVISO4AVISO5AVISO6
123410111213

O que eu queria é criar um valor só, com esses campos em uma lista eu tentei da seguinte forma:

select a.aviso1|| case
                   when a.aviso2 is not null
                     then ', '||aviso2
                   when a.aviso3 is not null
                     then ', '||aviso3
                    when a.aviso4 is not null
                     then ', '||aviso4
                    when a.aviso5 is not null
                     then ', '||aviso5
                    when a.aviso6 is not null
                     then ', '||aviso6
                       else null
                         end as avisos
from tb_avisosboleto a where a.seqboleto = 1234;

O resultado esperado seria: 10, 11, 12, 13

Porém o resultado que obtive é: 10, 11

Só a primeira validação funcionou, vocês tem alguma sugestão de como fazer isso, ou sabem o que estou fazendo de errado?

Obrigado.

2 respostas
solução!

Oi, Ulisses! Tudo bom contigo?

O código que você compartilhou não está retornando a lista de avisos completa, pois somente uma das condições do CASE é levada em consideração — assim que uma delas é identificada como verdadeira, as outras não são mais analisadas.

Para chegar no resultado esperado, podemos utilizar a função CONCAT_WS() do MySQL! Por meio dela, é possível unir várias strings por meio de um separador. Ao usá-la em seu código, chegamos em algo assim:

SELECT CONCAT_WS(', ', aviso1, aviso2, aviso3, aviso4, aviso5, aviso6) AS avisos
FROM tb_avisosboleto
WHERE seqboleto = 1234;

Após escrever o nome da função, precisamos explicitar qual será o seu separador — observe que escrevemos uma vírgula e colocamos um espaço depois dela. Por fim, basta indicar os campos da sua tabela (inclusive os com valores nulos).

A consulta final apresentará uma lista de valores sem considerar os nulos:

avisos
10, 11, 12, 13

Lembrando, Ulisses, que utilizei como exemplo a função do MySQL. Caso você esteja utilizando outro SGBD (Sistema Gerenciador de Banco de Dados), a função pode mudar um pouco, então é importante verificar este ponto!

Espero ter ajudado! Contudo, vale ressaltar que como é um assunto externo aos cursos da Alura e que não tenho acesso ao seu cenário, outros testes terão de ser feitos a fim de obter o resultado esperado, mas espero que esta resposta seja um bom ponto de partida para a resolução do seu problema.

Se surgirem outras dúvidas, estarei aqui para ajudar!

Abraço.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Andrieli Gonçalves, boa tarde. Esqueci de mencionar que estou estou usando Oracle, mas achei uma maneira de fazer essa operação, combinei o LISTAGG com o UNPIVOT, assim obtive o resultado esperado.

select seqboleto, seqcota, nossonumero, usualterou as usuemissao, dtaalteracao as dtaemissao, dtavencimento, listagg(NROLANCAMENTO, ', ') within group (order by NROLANCAMENTO) as avisos
from gc_boletocota
unpivot(NROLANCAMENTO for AVISOS in(
NROAVISO1, NROAVISO2, NROAVISO3, NROAVISO4, NROAVISO5,
NROAVISO6, NROAVISO7, NROAVISO8, NROAVISO9, NROAVISO10,
NROAVISO11, NROAVISO12, NROAVISO13, NROAVISO14, NROAVISO15,
NROAVISO16, NROAVISO17, NROAVISO18, NROAVISO19, NROAVISO20,
NROAVISO21))
group by seqboleto, seqcota, nossonumero, usualterou, dtavencimento, dtaalteracao;

Obrigado pela intereção.