在哪裏試圖避免生成兩個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」條款
你可以接受執行兩個select語句在一起的性能,只使用一個結果嗎? – Turophile
@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'也可能被安全地查詢(通過永久刪除前導空白或者如果沒有任何開頭)。 –
@Turophile,問題是大的查詢幾乎是一樣的,除了where子句和我不想要兩次相同的代碼:D –