当where子句条件为null时更新SQL

时间:2013-05-14 15:13:52

标签: java sql oracle prepared-statement ibatis

我有更新SQL语句来更新行

   UPDATE COM_TRANSACTION_LOGS    
        SET END_TIME  = ?, 
        RESPONSE   = ?  
   WHERE   
   TRANSACTION_ID  = ?   
   AND    
   MESSAGE_ID  = ?  

这里的问题是MESSAGE_ID在某些情况下可以为null,因此更新SQL为

  [DEBUG] {pstm-100101} Parameters:[2013-05-14 10:38:01.485, XML, 123XYZAAA1236511, null]

由于where子句变为

,因此无法更新
WHERE   
   TRANSACTION_ID  = '123XYZAAA1236511'
   AND    
   MESSAGE_ID  = null

如何通过预准备语句与空值进行比较。

我知道null比较的where子句必须像这样

   WHERE   
     TRANSACTION_ID  = '123XYZAAA1236511'
   AND    
      MESSAGE_ID  is null

如何在不使用两个查询的情况下将where子句设置为is null,并在null='somevalue

的情况下有条件地使用它们?

3 个答案:

答案 0 :(得分:4)

在Oracle中,有一个NVL语句用于完成此操作(nvl(?, value_to_replace_null))。我不确定你正在使用的SQL的哪种变体,但可能有类似的东西。您也可以将IFNULL, ISNULL, and COALESCE用于SQL Server和MySQL。

答案 1 :(得分:4)

您可以替换此行:

MESSAGE_ID  = ?  

由此:

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

答案 2 :(得分:0)

我更希望将NVL / NVL2用于您的目的。它完成了工作。