0

我来自前端背景,我正在尝试编写一个可以接受空参数的存储过程。这是一个简化版本:

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

2 回答 2

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);
于 2012-11-27T00:34:24.510 回答
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

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

于 2012-11-27T00:33:22.123 回答