Java 当where子句条件可以为空时更新SQL
我有一个更新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
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
(更便于移植)时所做的那样。您需要小心,如果您采用任何一种方法,那么您选择的“神奇”值永远不会存在于实际数据中。