sábado, 19 de novembro de 2011

Concatenando campos no MySQL

A matéria de hoje trata um assunto relativamente simples para que já tem algum conhecimento sobre SQL, mas em virtude do blog ter visitantes com todos os níveis de conhecimento, vamos abordar a função de concatenação no MySQL.

Concatenar campos nada mais é que junta-los a fim de demonstra-los somente em uma coluna, vamos a um exemplo:

1 - Demonstrar somente em uma coluna o nome da cidade seguida da unidade federativa.
 select concat(cidade.nome, '-' , estado.sigla)  
 from cidade inner join estado on cidade.id_uf = estado.id_uf 
 Results  
 Cuiabá - MT  
 São Paulo - SP  
 Rio de Janeiro - RJ  
Com o concat podemos unir informações de diferentes tipos de dados, varchar, double, date dentro outros, com uma ressalva somente para o encoding, Latin concatenado com UF8 possivelmente dará o erro: Illegal mix of collations, tendo que haver uma conversão forçada dos dados concatenados.

Além do concat, qual temos que apresentar repetidamente qual será o separador, temos concat_ws, que definimos o separador uma única vez, este é definindo na primeira expressão da função e é assumido para todas as colunas estipuladas pela condição select, vejamos mais um exemplo:

2 - Concatenar com o separador ; (Ponto é vírgula) o código do funcionário, nome e local de trabalho.
 select concat_ws(';',codigo, nome, local_trabalho)  
 from trabalhador;
 Results  
 01;Fabiano Abreu;Desenvolvimento  
 02;Everton;Desenvolvimento  
O concat_ws até tempos atrás era desconhecido para mim, o que me ocasionou grande revolta (:d) pois constantemente tenho que desenvolver relatórios em formato csv (Para serem abertos no excel), logo, concatenava: coluna ; coluna ; coluna ;.... sendo que com o ws declaro somente uma vez o ; e todas as concatenações estavam feitas.

Outro comando interessante no nicho concat é o group_concat, com ele concatenamos linhas ao invés de colunas, transformando o resultado das linhas em uma única coluna, vejamos:

3 - Demonstrar somente em uma linha todos os códigos de produtos da categoria frios.
 select group_concat(codigo_produto)  
 from produtos  
 where categoria = 'Frios';  
 Results  
 1,7,25,78...  

Bom pessoal, espero que as dicas tenham sido mais uma vez úteis e, sugestões, críticas ou elogios serão bem vindos.

Grande abraços.

Clique aqui e veja todas as matérias sobre MySQL

18 comentários:

  1. Ola Fabiano, preciso de uma orientação, é possível concatenar variável no comando Select?

    por exemplo:

    minha variável $woperador recebe do banco de dados o nome do operador logado.

    E em uma pagina para exibir os resultados de um filtro tenho a seguinte instrução:

    case "u10": $usersSql = "Select id,fullname,username,email,ip from users where super = 0 AND `delete` = '0' AND `opnome` = 'OperadorMaster' ORDER BY id DESC Limit 10";

    nesta instrução onde esta o 'OperadorMaster' quero subistituir pela variável... é possível?

    ResponderExcluir
  2. Olá Alex,

    Possuo pouco conhecimento em programação front-end, mas creio que seja totalmente provável o que deseja, pois, se já possui a informação em uma variável, é só compará-la na instrução.

    Grande abraço, e obrigado pela visita.

    ResponderExcluir
  3. Muito Obrigado vlw o
    Group_concat me ajudou muito aqui vlw mesmo!

    ResponderExcluir
    Respostas
    1. Olá Wendell,

      Eu que agradeço a visita, grande abraço.

      Excluir
  4. Muito boa explicação! O group_concat acabou de me ajudar bastante!

    ResponderExcluir
    Respostas
    1. Olá Fagner,

      Obrigado pelo feedback, abraços.

      Excluir
  5. Muito bom, tirei todas minhas duvidas, obrigado!

    ResponderExcluir
  6. Respostas
    1. Olá Souzace.

      Obrigado pelo feedback, grande abraço.

      Excluir
  7. Até hoje o tópico ainda é funcional, meus parabéns.

    ResponderExcluir
    Respostas
    1. Olá Amanda, fico feliz em ter ajudado.

      Obrigado pelo feedback.

      Excluir
  8. Valew mano, ajudou muito mesmo, obrigado!

    ResponderExcluir
    Respostas
    1. Olá Bruno.

      Fico feliz por ter ajudado, abraços.

      Excluir
  9. Como faço para listar com tamanho fixo de um campo exemplo: select substr(descricao,0,30) as descricao from produtos

    ResponderExcluir
    Respostas
    1. Você pode utilizar o comando rpad, ou lpad, representando direita e esquerda, respectivamente.

      SELECT RPAD('descricao',30,' ')

      Você pode especificar que será complementado com espaços, como no exemplo acima, mas fica a seu critério o "complemento".

      Abraços.

      Excluir