2

いくつかのプロシージャ引数に基づいてレコードを検索する必要があるストアド プロシージャを作成しています。問題は、常にすべての引数を渡す必要があるとは限らず、場合によっては NULL に設定される場合があることです。

そのように機能する sth を書く方法はありますか?

CREATE PROCEDURE testProc(IN p_idWorker INTEGER, IN p_idEffect INTEGER)
BEGIN
    SELECT 
        * 
    FROM 
        CallHistory
    WHERE
        idWorker = IFNULL(p_idWorker, ANYTHING)
        AND 
        idEffect = IFNULL(p_idEffect, ANYTHING);
END$$
4

3 に答える 3

4

そのようです:

 ...
 WHERE (p_idWorker IS NULL OR idWorkder = p_idWorker)
   AND (p_idEffect IS NULL OR idEffect = p_idEffect);

または、あなたがしたように、代わりにAnything列名を使用する代わりに、次のようにします。

   ...
   WHERE
        idWorker = IFNULL(p_idWorker, idWorker )
        AND 
        idEffect = IFNULL(p_idEffect, idEffect );
于 2012-12-10T08:56:24.970 に答える
3

たとえば、次のように使用できます。

    idWorker = IFNULL(p_idWorker, idWorker)

そのp_idWorker is null場合、この条件は常にTRUEすべての行に当てはまります。そうでない場合、それは次の場合にのみ当てはまりますidWorker = p_idWorker

于 2012-12-10T08:59:40.060 に答える
2

まず第一に、時間を割いてくれた Mahmoud と valex に感謝しますが、どちらの回答も完全に良いものではありません。たとえば、フィールドidWorkerが nullable の場合、それらは機能しません。フィールドの行は表示されませんidWorker IS NULL

これに対する究極の解決策は奇妙に見えますが、機能します。

...
WHERE 
    idWorker = IFNULL(p_idWorker, idWorker)
    AND
    IFNULL(ch.idProjTime, -1) = IFNULL(p_idProjTime, IFNULL(ch.idProjTime, -1))

NULLフィールドも表示されるようになりました。

そのように sth するのが悪い考えである場合 (パフォーマンスへの影響の可能性を確認できます - 3 回続けてIFNULL条件を実行します) - 修正してください。

于 2012-12-11T07:47:21.917 に答える