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

时间:2012-11-27 00:24:29

标签: 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;;

所以如果SELECT为空,我想要item_id所有内容,否则,我希望应用WHERE子句。这是这样做的吗?它似乎有效,但我不确定是否有更好的方法。

我想我也可以这样写:

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

2 个答案:

答案 0 :(得分:0)

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

是性能杀手:它不会使用 WHERE,而是会为每一行评估IF,因为它不是常量表达式。

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

是一种很好的方法,正如查询计划程序将看到的那样,WHERE评估为TRUE

的不断表达式

我的方法是将IF放入存储过程顶层,它决定两个查询之间,一个查询WHERE,另一个不查询。虽然这是非常严重的,但它也非常易读。

答案 1 :(得分:0)

它的工作方式应该很好:

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);