如果参数为null,MySQL存储过程将跳过WHERE条件

时间:2012-12-10 08:55:00

标签: mysql search stored-procedures multiple-columns

我正在编写应该根据几个过程参数搜索记录的存储过程。 问题是并不总是必须传递所有参数,有时它们可​​能被设置为NULL。

有没有办法写这样的工作?

CREATE PROCEDURE testProc(IN p_idWorker INTEGER, IN p_idEffect INTEGER)
BEGIN
    SELECT 
        * 
    FROM 
        CallHistory
    WHERE
        idWorker = IFNULL(p_idWorker, ANYTHING)
        AND 
        idEffect = IFNULL(p_idEffect, ANYTHING);
END$$

3 个答案:

答案 0 :(得分:4)

像这样:

 ...
 WHERE (p_idWorker IS NULL OR idWorkder = p_idWorker)
   AND (p_idEffect IS NULL OR idEffect = p_idEffect);

或者,就像你的方式一样,但不是Anything而是使用列名,而不是像这样:

   ...
   WHERE
        idWorker = IFNULL(p_idWorker, idWorker )
        AND 
        idEffect = IFNULL(p_idEffect, idEffect );

答案 1 :(得分:3)

您可以使用例如:

    idWorker = IFNULL(p_idWorker, idWorker)

如果p_idWorker is null,则所有行的此条件始终为TRUE。如果没有,则仅在idWorker = p_idWorker

时才为真

答案 2 :(得分:2)

首先,感谢Mahmoud和valex的时间,但两个答案都不是很好。如果字段idWorker可以为空,则它们将无效 - 它将看不到字段idWorker IS NULL的行。

对此的最终解决方案看起来很奇怪,但它确实有效:

...
WHERE 
    idWorker = IFNULL(p_idWorker, idWorker)
    AND
    IFNULL(ch.idProjTime, -1) = IFNULL(p_idProjTime, IFNULL(ch.idProjTime, -1))

现在它也会看到NULL字段。

如果不是那么想(我可以看到可能的性能影响 - 连续3次它会产生IFNULL条件) - 请纠正我。