2

我正在编写应该基于几个过程参数搜索记录的存储过程。问题是并非总是必须传递所有参数,有时它们可​​能设置为 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$$
4

3 回答 3

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 );
于 2012-12-10T08:56:24.970 回答
3

您可以使用例如:

    idWorker = IFNULL(p_idWorker, idWorker)

IFp_idWorker is null那么这个条件总是TRUE适用于所有行。如果不是,那么只有当idWorker = p_idWorker

于 2012-12-10T08:59:40.060 回答
2

首先感谢 Mahmoud 和 valex 的宝贵时间,但两个答案都不是很好。例如,如果字段idWorker可以为空,它们将不起作用 - 它不会看到 field 所在的行idWorker IS NULL

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

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

现在它也会看到NULL字段。

如果这样做是个坏主意(我可以看到可能的性能影响 - 连续 3 次出现这种IFNULL情况) - 请纠正我。

于 2012-12-11T07:47:21.917 回答