我来自前端背景,我正在尝试编写一个可以接受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));
答案 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);