quinta-feira, 19 de março de 2009

Artigo Nº 20: Concatenando resultados diretamente na SQL

Hoje vai aí um post sobre SQL, simples mas muito útil: concatenação de resultados em um select.

Acredito que quase todos os programadores em algum momento, precisou concatenar várias colunas de uma função select, agrupando em uma única coluna. Para isso, quem não conhece ou conhecia esse tipo de concatenação, resolve agrupando no próprio código de programação. Um exemplo que posso escrever é: para programadores .net que trabalha com POO(Programação Orientadas a Objetos) ou em camadas, resolve esse problema criando uma function que vai retorna em um formato de DateTable, dentro dessa function monta a SQL, depois manda executa a função para retornar os dados. Daí depois de passar pelo banco, lê cada resultado e manualmente cria-se uma nova coluna onde o valor vai ser a concatenação entre os duas ou mais colunas do resultado: Ex: Coluna 03 = ColunaSQL1 +'/'+ ColunaSQL2;

Bom, aí vai os exemplos de como proceder em diversos bancos de dados:

FIREBIRD
SELECT (COLUNA1 ||' - '|| COLUNA2) as RESULTADO from TABELA

SQL SERVER
SELECT (CAST(COLUNA1 AS VARCHAR)+' - '+ CAST(COLUNA2 AS VARCHAR)) AS RESULTADO FROM TABEL

POSTGREE
SELECT (COLUNA1 ||' - '|| COLUNA2) AS RESULTADO FROM TABELA

MYSQL
SELECT CONCAT(COLUNA1,' - ',COLUNA2) AS RESULTADO FROM TABELA

Esses são os exemplos de concatenação. Pode-se concatena quantas colunas que necessita, sempre seguindo as sintaxe.

Caso sua aplicação está voltada para conexão independente de banco, tome cuidado ao utilizar essas funções, crie uma forma de parametrizações que quando trocar de banco chame a sintaxe de acordo com o banco.

Obrigado. Abraços.

5 comentários:

Unknown disse...

Eu segui o exemplo mas só obtive resultados nulos:

SELECT CONCAT( Responsavel, ' - ', Participante2, ' - ', Participante3 ) AS participantes
FROM Participantes
WHERE GrupoCode = '1'
AND STATUS = 'Ativo'

Sem concatenar, além dos nulos, ele me traz os resultados esperados. Não sei porquê...

Anônimo disse...

se houver alguma coluna com valor nulo, todo o resultado ficara nulo,
use da seguinte forma:
SELECT isNUll(Responsavel,'') + ' - '+ isNUll(Participante2,'') + ' - ' + isNull(Participante3,'') AS participantes
FROM Participantes

Unknown disse...

Olá amigos, eu preciso fazer algo semelhante mas não estou conseguindo e gostaria de pedir vossa ajuda.

Eu gostaria de concatenar não as colunas e sim resultados com um campo em comum. Exemplo:

Tenho uma consulta que está retornando o seguinte resultado:

id_reg id_letra letra
1 134 a)
2 134 a)
3 135 b)
4 135 b)
5 136 c)
6 139 d)

PORÉM EU RETORNASSE DA SEGUINTE FORMA:
id_reg id_letra letra
1,2 134 a)
3,4 135 b)
5 136 c)
6 139 d)

Alguém pode me ajudar?

Se for necessário a query em questão é "SELECT FATDEC.ID_DEC ID_REG , NOR.ID_NOR ID_LETRA, NOR.CONORTIT LETRA, (SELECT COUNT(ID_NOR) FROM PRODWEB.CODECLARA A INNER JOIN PRODWEB.COFATDECL B ON A.ID_DEC = B.ID_DEC WHERE ID_NOR = NOR.ID_NOR AND ID_FAT = FATDEC.ID_FAT GROUP BY ID_NOR) NUMERO_DE_REPETICOES FROM PRODWEB.COFATDECL FATDEC INNER JOIN PRODWEB.CODECLARA DEC
ON FATDEC.ID_DEC = DEC.ID_DEC INNER JOIN PRODWEB.CONORMAS NOR
ON NOR.ID_NOR = DEC.ID_NOR
WHERE ID_FAT = 8 ORDER BY NOR.ID_NOR"

Obrigado.

Tiago José Pasieka disse...

Q banco de dados vc tah utilizando?

Caio Borges Ruival disse...

Estou usando DB2.