我有一堆内部联接的表,我试图从可能包含或不包含值的IN参数动态添加或连接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;
与下一个参数相同。
答案 0 :(得分:1)
使用静态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)