Usando IF e ELSE Statement no MySQL


Peguei o sistema de um cliente em que as tableas (esquema da imagem) precisavam ser consultadas juntamente, mas diferente do convencional, elas represemtam módulos que possuem colunas semelhantes, e que deveriam ser exibidas simultaneamente…

A primeira solução foi fazer um LEFT JOIN:

SELECT de.fase,
       bc.id, de.id, gr.id,
       bct.parcela, det.parcela, grt.parcela,
       bct.valor, det.valor, grt.valor,
       bct.vencimento, det.vencimento, grt.vencimento,
       bct.dt_pagamento, det.dt_pagamento, grt.dt_pagamento,
       bct.valor_pago, det.valor_pago, grt.valor_pago,
       bct.pagamento, det.pagamento, grt.pagamento
FROM   crm_laravel.students AS st
       LEFT JOIN crm_laravel.bank_cheques AS bc
              ON ( st.id = bc.student_id )
       LEFT JOIN crm_laravel.bank_cheque_tradings AS bct
              ON ( bc.id = bct.bank_cheque_id )
       LEFT JOIN crm_laravel.defaultings AS de
              ON ( st.id = de.student_id )
       LEFT JOIN crm_laravel.defaulting_tradings AS det
              ON ( de.id = det.defaulting_id )
       LEFT JOIN crm_laravel.graphics AS gr
              ON ( st.id = gr.student_id )
       LEFT JOIN crm_laravel.graphic_tradings AS grt
              ON ( gr.id = grt.graphic_id )
WHERE  1
ORDER  BY st.name ASC
LIMIT  100; 
imagem 02

Como podemos ver na imagem 02, além do resultado da consulta ficar sobrecarregado com tantas colunas, ela traz resultados em branco, devido ao LEFT JOIN, pois se aplicar uma condição para não trazer valor NULL, ela não traz as outras que tenham algum resultado, já que fazem parte do mesmo SELECT. O mesmo se aplica a qualquer condição que eu coloque após o parâmetro WHERE.

Foi aí que resolvi testar as condições IF and ELSE:

SELECT IF(500<1000, 5, 10);

Fonte: https://www.w3schools.com/sql/func_mysql_if.asp

Enfim essa foi a solução dos meus problemas, deixando o código mais rápido, legível e eficaz:

SELECT de.fase,
       IF(bc.id > 0, bc.id, IF(de.id > 0, de.id, gr.id))
       AS id,
       IF(bc.id > 0, 'cheque', IF(de.id > 0, 'contrato', 'grafica'))
       AS modulo,
       IF(bc.id > 0, bct.parcela, IF(de.id > 0, det.parcela, grt.parcela))
       AS parcela,
       IF(bc.id > 0, bct.valor, IF(de.id > 0, det.valor, grt.valor))
       AS valor,
       IF(bc.id > 0, bct.vencimento, IF(de.id > 0, det.vencimento, grt.vencimento)) AS
       vencimento,
       IF(bc.id > 0, bct.dt_pagamento, IF(de.id > 0, det.dt_pagamento, grt.dt_pagamento))
       AS dt_pagamento,
       IF(bc.id > 0, bct.valor_pago, IF(de.id > 0, det.valor_pago, grt.valor_pago)) AS
       valor_pago,
       IF(bc.id > 0, bct.pagamento, IF(de.id > 0, det.pagamento, grt.pagamento))
       AS
       pagamento
FROM   crm_laravel.students AS st
       LEFT JOIN crm_laravel.bank_cheques AS bc
              ON ( st.id = bc.student_id )
       LEFT JOIN crm_laravel.bank_cheque_tradings AS bct
              ON ( bc.id = bct.bank_cheque_id )
       LEFT JOIN crm_laravel.defaultings AS de
              ON ( st.id = de.student_id )
       LEFT JOIN crm_laravel.defaulting_tradings AS det
              ON ( de.id = det.defaulting_id )
       LEFT JOIN crm_laravel.graphics AS gr
              ON ( st.id = gr.student_id )
       LEFT JOIN crm_laravel.graphic_tradings AS grt
              ON ( gr.id = grt.graphic_id )
WHERE  IF(bc.id > 0, bct.dt_pagamento, IF(de.id > 0, det.dt_pagamento, grt.dt_pagamento)) >= '2021-03-03'
       AND
	   IF(bc.id > 0, bct.dt_pagamento, IF(de.id > 0, det.dt_pagamento, grt.dt_pagamento)) <= '2021-03-30'
ORDER  BY st.name ASC
LIMIT  1000;
imagem 03

E a imagem 03 é o resultado final!

Também pude usufruir do mesmo esquema de consulta para formatar os valores da tabela students conforme a soliciação do cliente:

  1. cod_unidade: máximo de 3 caracteres com zeros à esquerda;
  2. cod_curso: máximo de 3 caracteres com zeros à esquerda;
  3. ctr: máximo de 5 caracteres com zeros à esquerda;
UPDATE students SET
	cod_unidade = (if(length(cod_unidade) = 2, CONCAT('0','',cod_unidade), 
	if(length(cod_unidade) = 1, CONCAT('00','',cod_unidade),
	if(length(cod_unidade) = 0, '000', cod_unidade)))),

    cod_curso = (if(length(cod_curso) = 2, CONCAT('0','',cod_curso), 
	if(length(cod_curso) = 1, CONCAT('00','',cod_curso),
	if(length(cod_curso) = 0, '000', cod_curso)))),

    ctr = (if(length(ctr) = 4, CONCAT('0','',ctr),  
	if(length(ctr) = 3, CONCAT('00','',ctr), 
	if(length(ctr) = 2, CONCAT('000','',ctr), 
	if(length(ctr) = 1, CONCAT('0000','',ctr),
	if(length(ctr) = 0, '00000', ctr))))))
WHERE 1;

(งツ)ว

Moeda Tipo Valor
Dollar Compra R$ 5,97
Dollar Venda R$ 5,97
Data 22/01/2025

January 2025
S M T W T F S
 1234
567891011
12131415161718
19202122232425
262728293031