Java 当where子句条件可以为空时更新SQL

Java 当where子句条件可以为空时更新SQL,java,sql,oracle,prepared-statement,ibatis,Java,Sql,Oracle,Prepared Statement,Ibatis,我有一个更新SQL语句来更新一行 UPDATE COM_TRANSACTION_LOGS SET END_TIME = ?, RESPONSE = ? WHERE TRANSACTION_ID = ? AND MESSAGE_ID = ? 这里的问题是,消息\u ID在某些情况下可能为空,因此更新SQL如下所示 [DEBUG] {pstm-100101} Parameters:[2

我有一个更新SQL语句来更新一行

   UPDATE COM_TRANSACTION_LOGS    
        SET END_TIME  = ?, 
        RESPONSE   = ?  
   WHERE   
   TRANSACTION_ID  = ?   
   AND    
   MESSAGE_ID  = ?  
这里的问题是,
消息\u ID
在某些情况下可能为空,因此更新SQL如下所示

  [DEBUG] {pstm-100101} Parameters:[2013-05-14 10:38:01.485, XML, 123XYZAAA1236511, null]
由于where子句变为

WHERE   
   TRANSACTION_ID  = '123XYZAAA1236511'
   AND    
   MESSAGE_ID  = null
如何通过预处理语句与空值进行比较

我知道空比较的where子句必须是这样的

   WHERE   
     TRANSACTION_ID  = '123XYZAAA1236511'
   AND    
      MESSAGE_ID  is null

我如何告诉我准备好的语句将where子句设置为
为null
,而不使用两个查询,并且在
null
='somevalue
的情况下有条件地使用它们在Oracle中有一个语句可以实现这一点(
nvl(?,value\u to\u replace\u null)
)。我不确定您使用的是哪种SQL变体,但可能也有类似的情况。您也可以使用SQL Server和MySQL。

您可以替换此行:

MESSAGE_ID  = ?  
据此:

COALESCE(MESSAGE_ID,-1) = COALESCE(?,-1)

我更愿意为您的目的使用NVL/NVL2。它完成了工作。

只需使用两个准备好的语句,只要您没有无限数量的不同语句,就不会有bgi问题SNVL不起作用。log语句将update查询显示为update COM_TRANSACTION_LOGS SET END_TIME=?,RESPONSE=?其中,MESSAGE_ID=NVL(?,'is NULL')和TRANSACTION_ID=?@NullPointerException-您需要测试的两边都使用
NVL
,以便它们获得相同的值,就像Adrian使用
coalesce
(更便于移植)时所做的那样。您需要小心,如果您采用任何一种方法,那么您选择的“神奇”值永远不会存在于实际数据中。