在存储过程mysql中创建动态查询?

wko9yo5t  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(569)

我有一堆表是内部连接的,我正在尝试动态地添加或连接参数中的where子句,这些参数可能包含值,也可能不包含值。

PROCEDURE `tablaReporte`(IN IdSeguro int, IN IdTomador int, IN IdAgente int, IN fechaInicio date)
BEGIN
SELECT p.Id_seguro, CONCAT(c.Nombre, ' ', c.Apellido) AS Nombre, CONCAT(a.Nombre, ' ', a.Apellido) AS NombreAgente,
p.fechaInicio, p.fechaFin, p.fechaContratacion, s.TipoSeguro, e.Descripcion
FROM POLIZA P 
INNER JOIN TOMADOR C ON P.Id_tomador = C.IdTomador
INNER JOIN AGENTE A ON P.Id_agente = A.idAgente
INNER JOIN SEGURO S ON P.Id_seguro = S.idSeguro
INNER JOIN ESTADO E ON S.idEstado = E.idEstado
WHERE P.Id_seguro = IdSeguro AND

这是我必须验证下一个参数是否有值的部分。像这样的

IF IdTomador IS NOT NULL
THEN
 CONCAT(' P.Id_tomador = ', IdTomador); //Concat to the initial query
END IF;

下一个参数也是一样。。

qqrboqgw

qqrboqgw1#

不要使用动态sql,而是使用静态sql语句,以适应参数可能为null的事实。
所以这总是在where子句中: P.Id_tomador = coalesce(IdTomador, p.id) 完整查询将是:

SELECT p.Id_seguro, CONCAT(c.Nombre, ' ', c.Apellido) AS Nombre, CONCAT(a.Nombre, ' ', a.Apellido) AS NombreAgente,
p.fechaInicio, p.fechaFin, p.fechaContratacion, s.TipoSeguro, e.Descripcion
FROM POLIZA P 
INNER JOIN TOMADOR C ON P.Id_tomador = C.IdTomador
INNER JOIN AGENTE A ON P.Id_agente = A.idAgente
INNER JOIN SEGURO S ON P.Id_seguro = S.idSeguro
INNER JOIN ESTADO E ON S.idEstado = E.idEstado
WHERE P.Id_seguro = IdSeguro AND
P.Id_tomador = coalesce(IdTomador, p.id)

相关问题