2014-02-06 125 views
1

在哪裏試圖避免生成兩個sql遊標,因爲我們只需要將WHERE子句更改爲動態遊標。As400 - Dynamic Sql where子句

我們一個光標執行此WHERE子句:

WHERE TRIM (USUARIO) LIKE @USUARIO) 
AND CAST (M15 . FECLLEGADA AS DATE) BETWEEN @FINI AND @FFIN 
AND M15 . ESTINBOX IN ('A' , 'P') 
AND URGENTE LIKE (COALESCE (@URGENTE , '') CONCAT '%') 

,並與該另一個遊標WHERE子句:

WHERE 
    CAST (M15 . FECLLEGADA AS DATE) BETWEEN @FINI AND @FFIN 
    AND TRIM (USUARIO) LIKE @USUARIO 
    AND M15 . ESTINBOX LIKE (COALESCE (@ESTADO , '') CONCAT '%') 
    AND URGENTE LIKE (COALESCE (@URGENTE , '') CONCAT '%') 

有什麼辦法來執行此where子句中只有一個聲明:¿

這就是我試過的:

WHERE 
CASE 
     WHEN @ESTADO='PR' then ESTINBOX IN ('A','P') 
     ELSE M15.ESTINBOX(COALESCE ( @ESTADO , '') CONCAT '%') 
END 

存儲過程不編譯。如果這是可行的我怎麼能追加到CASE當 額外的「AND」條款

+0

你可以接受執行兩個select語句在一起的性能,只使用一個結果嗎? – Turophile

+0

@Turophile - 我想知道它與使用非SARGable搜索字詞的比較。 [時間戳至少可以安全地查詢](http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in-common.aspx )。 400上的DB2忽略尾隨空白進行比較,所以'USARIO'也可能被安全地查詢(通過永久刪除前導空白或者如果沒有任何開頭)。 –

+0

@Turophile,問題是大的查詢幾乎是一樣的,除了where子句和我不想要兩次相同的代碼:D –

回答

3

這樣的事情,可能是?

... WHERE TRIM (USUARIO) LIKE @USUARIO 
     AND CAST (M15.FECLLEGADA AS DATE) BETWEEN @FINI AND @FFIN 
     AND URGENTE LIKE (COALESCE (@URGENTE , '') CONCAT '%') 
     AND ( 
     (@ESTADO = 'PR' AND M15.ESTINBOX IN ('A' , 'P')) 
     OR 
     (@ESTADO != 'PR' AND M15.ESTINBOX LIKE COALESCE (@ESTADO , '') CONCAT '%' 
    ) 
+0

公關不是一個真正的分貝值。只是一個國旗.net –

+0

我敢肯定,我可以看到。你想說什麼? – mustaccio