BEM VINDO AO BLOG DO MARCOS CARRARO CRIADOR DO "CARRARO DASHBOARD". MUITO MAIS QUE UM SIMPLES BLOG.

quarta-feira, 13 de novembro de 2013

Consultas Avançadas SQL - group_concat if/else

Buenas,

Hoje vai algumas dicas de consultas em SQL, muitas dicas legais...

Primeiro de tudo vamos verificar o group_concat();

- A consulta normal retorna...

MariaDB [db_painel]> select * from tb_ips;
+-------+---------------+------------+-------------------+-----------------------+------+
| id_ip | range_ip      | mascara_ip | host              | descricao_ips         | tipo |
+-------+---------------+------------+-------------------+-----------------------+------+
|     2 | 192.168.1.0   |          7 | NULL              | Rede Interna          | r    |
|     6 | 10.0.0.1      |         14 | fw                | Firewall principal    | h    |
|    10 | 192.168.1.101 |         14 | oracle            | Servidor Oracle Focco | h    |
|    11 | 10.0.0.0      |         10 | NULL              | DMZ                   | r    |
|    12 | 172.16.1.0    |          8 | NULL              | EXTERNA               | r    |
|    13 | 192.168.1.120 |          8 | bkp               | Servidor de bkp       | h    |
|    14 | 0.0.0.0       |          1 | NULL              | QUALQUER REDE         | r    |
|    15 | 201.2.55.99   |         15 | NULL              | LINK 2                | r    |
|    16 | 172.16.1.1    |          8 | TS                | TS w2k8 SERVER2       | h    |
|    17 | 8.8.8.8       |          1 | google-dns        | google-dns            | h    |
|    18 | 8.8.4.4       |         15 | google-dns2-teste | google-dns2-teste     | h    |
+-------+---------------+------------+-------------------+-----------------------+------+
11 rows in set (0.00 sec)


Repare que os ips tem um tipo R para REDE e H para HOST, então vamos agrupar tudo que for HOST e tudo que for REDE.

MariaDB [db_painel]> select tipo,group_concat(descricao_ips,'=',range_ip,'  ') as grupos from tb_ips group by tipo;
+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tipo | grupos                                                                                                                                                                            |
+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| h    | google-dns2-teste=8.8.4.4  ,google-dns=8.8.8.8  ,TS w2k8 SERVER2=172.16.1.1  ,Servidor de bkp=192.168.1.120  ,Servidor Oracle Focco=192.168.1.101  ,Firewall principal=10.0.0.1   |
| r    | EXTERNA=172.16.1.0  ,DMZ=10.0.0.0  ,QUALQUER REDE=0.0.0.0  ,LINK 2=201.2.55.99  ,Rede Interna=192.168.1.0                                                                         |
+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

Então, repare que a query ficou assim.
> select tipo,group_concat(descricao_ips,'=',range_ip,'  ') as grupos from tb_ips group by tipo;

Aqui vamos montar os grupos pelo seu tipo, então tudo que for do tipo 'H' vai concatenar pela descricao+IP, e dando um espaço.

Se for usar em alguma pagina php, ou html pode fazer a quebra 
> select tipo,group_concat(descricao_ips,'=',range_ip,'<br>') as grupos from tb_ips group by tipo;


-- if/else no sql
Na verdade aqui vamos utilizar o 'case' do mysql, ele fica mais fácil de entender em uma grande consulta.

Vamos fazer da seguinte maneira, se for do tipo H vai mostrar HOST, se for do tipo R vai mostrar REDE.

MariaDB [db_painel]> select (CASE WHEN tipo='r' then 'REDE' ELSE 'HOST' END) AS TIPO_DECODE,tipo from tb_ips;
+-------------+------+
| TIPO_DECODE | tipo |
+-------------+------+
| REDE        | r    |
| HOST        | h    |
| HOST        | h    |
| REDE        | r    |
| REDE        | r    |
| HOST        | h    |
| REDE        | r    |
| REDE        | r    |
| HOST        | h    |
| HOST        | h    |
| HOST        | h    |
+-------------+------+
11 rows in set (0.00 sec)

Então a clausula CASE funciona da seguinte maneira.
(CASE WHEN tipo='r' THEN 'REDE'   // Se tipo for igual a R então imprime REDE

ELSE 'HOST'  // Se não for do tipo R no caso vai ser do tipo H, então por sua vez imprime HOST

END) // Finaliza o bloco.

Você pode estar se pensando e se quero validar mais informações.... poderia implementar um case dentro do outro...


(CASE WHEN tipo='r' THEN 'REDE' 
ELSE (  (CASE WHEN tipo='h' THEN 'HOST' 
       ELSE 'TIPO DESCONHECIDO'  
       END)  )  
END) 

Repare que aqui já temos os dois CASE dentro um do outro, e assim pode fazer uma pilha....

SQL ainda tem muito mais funções, é espetacular...

Vale lembrar que quanto menos linhas de código o sistema tiver mais performático ele vai ser, pois são menos tratamentos na programação para validar os dados.

abraços
marcos carraro.



Nenhum comentário:

Postar um comentário

Posts que a turma mais esta lendo...

Posts que a turma mais esta lendo...

Marcos Carraro