0

私はフロントエンドのバックグラウンドから来ており、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;;

したがって、nullのSELECT場合はすべてを実行し、それ以外の場合は句を適用します。これはそれを行う方法ですか?うまくいくようですが、もっと良い方法があるかどうかはわかりません。item_idWHERE

私もこのように書くことができると思います:

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

2 に答える 2

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、ストアドプロシージャのトップレベルにを配置することです。これにより、2つのクエリのどちらかを決定します。一方にWHEREは、があり、もう一方にはありません。これは非常に冗長ですが、非常に読みやすくなっています。

于 2012-11-27T00:33:22.123 に答える
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 に答える