How to add parameters in the WHERE of a Procedure without using IF?

Asked

Viewed 29 times

0

I have the following Query:

CREATE DEFINER=`db`@`%` PROCEDURE `RelatorioComissoesByDate`(
    IN initialPeriod DATETIME,
    IN finalPeriod DATETIME,
    IN FK_Corretora INT,
    IN NomeCliente VARCHAR(256),
    IN Seguradora VARCHAR(256)
)
BEGIN
    IF NomeCliente IS NULL AND Seguradora IS NULL THEN 
        SELECT c.FullName,p.Descricao as DescricaoPedido, S.Descricao as Seguradora, p.PremioLiquidoTotal,p.ComissaoLiquidoTotal,p.PercentualComissao,p.PercentualImpostos, pcss.ValorComissaoLiquido,pcss.Parcela, p.Parcelas as ParcelasTotais, pcss.ComissaoRecebida, pcss.DataRecebimentoComissao,PC.Descricao FROM pedidos p  INNER JOIN clientes c on c.ID = p.FK_Clientes  INNER JOIN corretorausuario CUsuario on C.FK_CorretoraUsuario = CUsuario.ID  INNER JOIN seguradoras S on S.ID = p.FK_Seguradoras  INNER JOIN pedidoscategorias PC on PC.ID = p.FK_PedidosCategorias  INNER JOIN pedidostatus PS ON PS.ID = p.FK_PedidoStatus  INNER JOIN pedidoscomissoes pcss on pcss.FK_Pedidos = p.ID 
        WHERE CUsuario.FK_Corretora = FK_Corretora and pcss.DataRecebimentoComissao between initialPeriod and finalPeriod;

    ELSEIF NomeCliente IS NOT NULL AND Seguradora IS NOT NULL THEN
        SELECT c.FullName,p.Descricao as DescricaoPedido, S.Descricao as Seguradora, p.PremioLiquidoTotal,p.ComissaoLiquidoTotal,p.PercentualComissao,p.PercentualImpostos, pcss.ValorComissaoLiquido,pcss.Parcela, p.Parcelas as ParcelasTotais, pcss.ComissaoRecebida, pcss.DataRecebimentoComissao,PC.Descricao FROM pedidos p  INNER JOIN clientes c on c.ID = p.FK_Clientes  INNER JOIN corretorausuario CUsuario on C.FK_CorretoraUsuario = CUsuario.ID  INNER JOIN seguradoras S on S.ID = p.FK_Seguradoras  INNER JOIN pedidoscategorias PC on PC.ID = p.FK_PedidosCategorias  INNER JOIN pedidostatus PS ON PS.ID = p.FK_PedidoStatus  INNER JOIN pedidoscomissoes pcss on pcss.FK_Pedidos = p.ID 
        WHERE CUsuario.FK_Corretora = FK_Corretora and pcss.DataRecebimentoComissao between initialPeriod and finalPeriod and c.FullName LIKE CONCAT('%', NomeCliente , '%') and S.Descricao LIKE CONCAT('%', Seguradora , '%');

    ELSEIF NomeCliente IS NOT NULL THEN
        SELECT c.FullName,p.Descricao as DescricaoPedido, S.Descricao as Seguradora, p.PremioLiquidoTotal,p.ComissaoLiquidoTotal,p.PercentualComissao,p.PercentualImpostos, pcss.ValorComissaoLiquido,pcss.Parcela, p.Parcelas as ParcelasTotais, pcss.ComissaoRecebida, pcss.DataRecebimentoComissao,PC.Descricao FROM pedidos p  INNER JOIN clientes c on c.ID = p.FK_Clientes  INNER JOIN corretorausuario CUsuario on C.FK_CorretoraUsuario = CUsuario.ID  INNER JOIN seguradoras S on S.ID = p.FK_Seguradoras  INNER JOIN pedidoscategorias PC on PC.ID = p.FK_PedidosCategorias  INNER JOIN pedidostatus PS ON PS.ID = p.FK_PedidoStatus  INNER JOIN pedidoscomissoes pcss on pcss.FK_Pedidos = p.ID 
        WHERE CUsuario.FK_Corretora = FK_Corretora and pcss.DataRecebimentoComissao between initialPeriod and finalPeriod and c.FullName LIKE CONCAT('%', NomeCliente , '%');

    ELSEIF Seguradora IS NOT NULL THEN 
        SELECT c.FullName,p.Descricao as DescricaoPedido, S.Descricao as Seguradora, p.PremioLiquidoTotal,p.ComissaoLiquidoTotal,p.PercentualComissao,p.PercentualImpostos, pcss.ValorComissaoLiquido,pcss.Parcela, p.Parcelas as ParcelasTotais, pcss.ComissaoRecebida, pcss.DataRecebimentoComissao,PC.Descricao FROM pedidos p  INNER JOIN clientes c on c.ID = p.FK_Clientes  INNER JOIN corretorausuario CUsuario on C.FK_CorretoraUsuario = CUsuario.ID  INNER JOIN seguradoras S on S.ID = p.FK_Seguradoras  INNER JOIN pedidoscategorias PC on PC.ID = p.FK_PedidosCategorias  INNER JOIN pedidostatus PS ON PS.ID = p.FK_PedidoStatus  INNER JOIN pedidoscomissoes pcss on pcss.FK_Pedidos = p.ID 
        WHERE CUsuario.FK_Corretora = FK_Corretora and pcss.DataRecebimentoComissao between initialPeriod and finalPeriod and   S.Descricao LIKE CONCAT('%', Seguradora , '%');

   END IF;

END

How did you all realize SELECT are the same, what changes is the WHERE because I need him to add clauses only in the parameters that are NOT NULL but the approach I used in my view is very amateur, but I’m not finding another way to do it without having to repeat code...

1 answer

2


One approach you can try is the following

SELECT  
    c.FullName,
    p.Descricao as DescricaoPedido, 
    S.Descricao as Seguradora, 
    p.PremioLiquidoTotal,
    p.ComissaoLiquidoTotal,
    p.PercentualComissao,
    p.PercentualImpostos, 
    pcss.ValorComissaoLiquido,
    pcss.Parcela, 
    p.Parcelas as ParcelasTotais, 
    pcss.ComissaoRecebida, 
    pcss.DataRecebimentoComissao,
    PC.Descricao 
FROM 
    pedidos p  
    INNER JOIN clientes c on c.ID = p.FK_Clientes  
    INNER JOIN corretorausuario CUsuario on C.FK_CorretoraUsuario = CUsuario.ID  
    INNER JOIN seguradoras S on S.ID = p.FK_Seguradoras  
    INNER JOIN pedidoscategorias PC on PC.ID = p.FK_PedidosCategorias  
    INNER JOIN pedidostatus PS ON PS.ID = p.FK_PedidoStatus  
    INNER JOIN pedidoscomissoes pcss on pcss.FK_Pedidos = p.ID 
WHERE 
    CUsuario.FK_Corretora = FK_Corretora AND 
    pcss.DataRecebimentoComissao between initialPeriod and finalPeriod AND
    (NomeCliente IS NULL OR c.FullName LIKE CONCAT('%', NomeCliente , '%')) AND
    (Seguradora IS NULL OR S.Descricao LIKE CONCAT('%', Seguradora , '%'))

Realize that inside the WHERE I check if it’s NULL or the research you want to do.
If the value of NomeCliente, for example, for nulo, the right research is discarded immediately, IE, will ignore this research as it will be true. The same goes for insurers.

In this case, it will only actually perform the search when the values are not null.

  • 1

    Very good, solved my problem and +1 point in kkkk knowledge was worth

Browser other questions tagged

You are not signed in. Login or sign up in order to post.