MySQL存储过程中的可选WHERE比较

MySQL存储过程中的可选WHERE比较,mysql,Mysql,我来自前端后台,我正在尝试编写一个可以接受null参数的存储过程。这里有一个简化版: CREATE PROCEDURE get_item(IN item_id INT(11)) BEGIN SELECT * FROM item a WHERE a.item_id = IF(item_id IS NULL, a.item_id, item_id); END;; 因此,如果item\u id为空,我想选择所有内容,否则,我想应用WHERE子句。这样做吗?这似乎有效,但我不确定是否有更好的方法

我来自前端后台,我正在尝试编写一个可以接受null参数的存储过程。这里有一个简化版:

CREATE PROCEDURE get_item(IN item_id INT(11))
BEGIN

SELECT * FROM item a WHERE a.item_id = IF(item_id IS NULL, a.item_id, item_id);

END;;
因此,如果
item\u id
为空,我想
选择
所有内容,否则,我想应用
WHERE
子句。这样做吗?这似乎有效,但我不确定是否有更好的方法

我想我也可以这样写:

SELECT * FROM item a WHERE ((item_id IS NULL) OR (a.item_id = item_id));
是一个性能杀手:它将对每一行计算
IF
,而不是使用noWHERE,因为它不是一个常量表达式

SELECT * FROM item a WHERE ((item_id IS NULL) OR (a.item_id = item_id));
正如查询规划者将看到的那样,
WHERE
计算为
TRUE


我的方法是将一个
IF
放入存储过程顶层,它决定两个查询,一个查询有
WHERE
,另一个查询没有。虽然这很冗长,但也很可读。

它应该可以像您那样正常工作:

SELECT * 
FROM item a 
WHERE @item_id IS NULL OR a.item_id = @item_id;
或:


谢谢你,欧根。我确实在顶层设置了
IF
,它决定了两个查询。问题是,它不是干的,你最终会重复代码,而我的代码很长。这就是我对verbouse的理解。如果这对可读性没有帮助,就不要这样做,而是使用第二个查询。我概述了上面的“为什么”。这两个都会通过对所有行运行WHERE而不是忽略它来破坏性能。@EugenRieck的第一个语句不等于我的第二个语句吗?@pixelfreak你是对的,我错了:第一个是“好的”,第二个是“坏的”。。。第一个表达式是常量,第二个表达式不是常量
SELECT * 
FROM item a 
WHERE @item_id IS NULL OR a.item_id = @item_id;
SELECT * 
FROM item a 
WHERE a.item_id = COALESCE(@item_id, a.item_id);