2012-12-10 50 views
2

我寫存儲過程,應該尋找一些對過程參數記錄的基礎。 問題是,並非所有參數都必須傳遞,有時它們可​​能會設置爲NULL。MySQL存儲Pocedures跳過WHERE條件,如果參數爲null

是否有寫某事,將工作這樣的方式?

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$$ 
+0

它完全沒問題 –

+2

不是真正的Sashi-在MySQL中沒有像'ANYTHING'這樣的關鍵字;) – Joe

回答

2

首先謝謝馬哈茂德和VALEX您的時間,但兩個答案都沒有完全好。如果例如字段idWorker可爲空 - 它將不會看到字段idWorker IS NULL的行。

對此的最終解決方案看起來很奇怪,但它的工作原理:

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

現在會看到NULL領域了。

如果是壞主意某事物一樣,(我可以看到可能影響性能 - 3次連續它的IFNULL條件) - 請大家指正。

3

像這樣:

... 
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); 
+0

第一個不會工作,因爲它會選擇idWorker爲NULL的行,即使我設置了p_idWorker參數。第二個是偉大的,你是第一個'解決'標記去找你。謝謝。 – Joe

+0

經過一些測試,我不得不弔銷接受不幸的。例如,默認情況下,列idWorker爲NULL時,它不起作用。查詢中不會看到該列中具有NULL的所有行。 – Joe

2

可以使用,例如:

idWorker = IFNULL(p_idWorker, idWorker) 

IF p_idWorker is null那麼對於所有行,這種情況總是TRUE。如果沒有,那麼它是真實的,只有當所有的idWorker = p_idWorker

+0

這是很好的答案,但你是第二,所以不公平的給你解決方案的標誌,但爲你+1。謝謝。 – Joe

+0

似乎經過一些測試,這不是一個好的解決方案 - 請參閱Mahmoud Gamal答案下的我的第二條評論。 – Joe