2014-02-06 65 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