3

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

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

这里的问题是MESSAGE_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 子句设置为is null不使用两个查询并在null或的情况下有条件地使用它们='somevalue

4

3 回答 3

4

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

于 2013-05-14T15:19:51.407 回答
4

您可以替换此行:

MESSAGE_ID  = ?  

这样:

COALESCE(MESSAGE_ID,-1) = COALESCE(?,-1)
于 2013-05-14T15:22:00.653 回答
0

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

于 2013-05-18T20:59:13.850 回答