我有一个更新触发器,当另一列(col2)更新为2(来自另一个值)时,会向行的数字列(col1)添加+1。我试图计算col2更新为2的次数。当col1不为null时,触发器工作正常,但我也希望能够处理null情况(将null视为0)。
我认为合并函数(coalesce(deleted.col1+1,1)
)可以工作,但如果列开始为null,则列保持为null。它确实"工作"如果值不为null,则使用coalesce函数。
NOT NULL
条件也不适用于空案例。另外,第二个UPDATE(SET col1=1
)带有一个WHERE子句,询问deleted.col1 IS NULL
是否在空案例中没有更新,所以我有点困惑。
关于问题是什么的任何想法?
代码:
CREATE TRIGGER schema1.trigger1
ON schema1.table1
FOR UPDATE
AS
IF UPDATE(col2)
BEGIN
UPDATE t
SET t.col1 = coalesce(d.col1+1,1)
FROM schema1.table1 AS t
INNER JOIN INSERTED AS i ON t.ID = i.ID
INNER JOIN DELETED AS d ON i.ID = d.ID
WHERE i.col2 = 2
AND d.col2 != 2
AND i.col1 = d.col1;
--WHERE...i.col1 = d.col1 added in case this column is being updated by user
END;
第一次发布,如果有任何我可以做的改进我的问题,请不要犹豫,让我知道。
答案 0 :(得分:2)
您的问题出在WHERE
子句中,而不是COALESCE()
函数:
WHERE i.col2 = 2 AND d.col2 != 2 AND i.col1 = d.col1;
如果d.col1为空,则第二个条件(i.col1 = d.col1
)永远不会求值为TRUE。
一种可能的解决方案是编写如下内容:
WHERE
i.col2 = 2 AND
d.col2 != 2 AND
(i.col1 = d.col1 OR (i.col1 IS NOT NULL AND d.col1 IS NULL)) ;