我正在编写应该根据几个过程参数搜索记录的存储过程。 问题是并不总是必须传递所有参数,有时它们可能被设置为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$$
答案 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
条件) - 请纠正我。