【发布时间】:2016-02-11 22:28:37
【问题描述】:
对不起,如果这是一个骗局 - 我搜索了类似的问题,但它们似乎都符合条件更新,您可以使用 CASE 语句将列设置为多个值之一。
我有一个 SQL UPDATE 语句,但我不希望它更新的原因有两个:
- 未找到该项目(导致 rowsUpdated 为 0)
- 如果满足条件
我想以某种方式区分这两种状态,这就是为什么我不能只将条件放在 WHERE 子句中。
它目前看起来像这样:
UPDATE MY_TABLE t
SET t.TITLE = :TITLE,
t.TYPE = :TYPE,
t.STATE = :STATE,
t.UPDTIME = :UPDTIME
WHERE t.ITEM_ID = :ITEM_ID
AND exists (SELECT t.ITEM_ID
FROM MY_TABLE t, USERINFO ui
WHERE ui.USERID = t.USERID
AND ui.USERNAME = :USERNAME
AND t.ITEM_ID = :ITEM_ID);
如果它在MY_TABLE 中找到(并更新)与给定 USERNAME 和 ITEM_ID 匹配的项目,则返回 1,否则返回 0。
我想添加一些内容,以便它不会在 t.STATE = 'READ_ONLY' 时更新,但它会做一些事情来将该条件与“该项目不存在”条件区分开来。也许会抛出某种错误?
我可以在更新之前运行SELECT 语句以确保该项目的状态不是READ_ONLY,但这似乎很浪费。有没有更好的办法?
【问题讨论】:
-
您可以添加一个虚拟计算,例如
t.UPDTIME = CASE WHEN t.STATE = 'READ_ONLY' THEN 1/0 ELSE :UPDTIME END。1/0应该抛出一个 除以零,你可以捕捉到。 -
这很聪明,但有点老套,你不是说吗?我喜欢你的头在哪里:) 我希望出现某种自定义错误——但我什至不确定这在 SQL 中是否可行。这样,我们就可以避免忽略一个合法的除以零错误,正如 Felipe 所说。并不是说我们当前的架构设置很可能会发生这种情况,但谁知道未来会怎样?
标签: sql oracle sql-update