可以在单个 SQL 合并中激活多个 WHEN MATCHED AND ... 条件吗?
MERGE INTO translation t
USING (
SELECT d.iddiagram, rt.uuid_translation, rt.context, r.idrectangle, rt.x, rt.y, rt.z
FROM json_to_recordset('${JSON.stringify(data.translation)}') AS rt(${column_list.translation})
JOIN json_to_recordset('${JSON.stringify(data.rectangle)}') AS rr(${column_list.rectangle}) ON rt.idrectangle=rr.idrecta>
JOIN rectangle r ON r.uuid_rectangle=rr.uuid_rectangle
JOIN diagram d ON d.uuid_diagram='${uuid_diagram}'
) rt
ON t.uuid_translation = rt.uuid_translation
WHEN NOT MATCHED BY TARGET THEN
INSERT (iddiagram, uuid_translation, context, idrectangle, x, y, z)
VALUES(rt.iddiagram, rt.uuid_translation, rt.context, rt.idrectangle, rt.x, rt.y, rt.z)
WHEN MATCHED AND t.context != rt.context THEN
UPDATE SET context = rt.context
WHEN MATCHED AND t.x != rt.x THEN
UPDATE SET x = rt.x
WHEN MATCHED AND t.y != rt.y THEN
UPDATE SET y = rt.y
WHEN MATCHED AND t.z != rt.z THEN
UPDATE SET z = rt.z
WHEN NOT MATCHED BY SOURCE
AND EXISTS(SELECT * FROM diagram d WHERE d.iddiagram=t.iddiagram AND d.uuid_diagram='${uuid_diagram}')
THEN DELETE
在上面的例子中,当同时 t.x != rt.x 和 t.y != rt.y 和 t.z != rt.z 时会发生什么?将执行多少个更新?
可以在单个 SQL 合并中激活多个 WHEN MATCHED AND ... 条件吗?
不适用于一次单个传入行,不适用于由单独的
when matched
情况指定的多个条件。只有组合成一个 when matched
情况的多个条件才能“激活”给定行。不同的传入行可以匹配不同的情况。
在上面的例子中,当同时 t.x != rt.x 和 t.y != rt.y 和 t.z != rt.z 时会发生什么?将执行多少个更新?
正如已经指出的,除非您将它们设置为单一情况,否则仅适用第一个匹配,这意味着在
uuid_translation
上匹配的传入行只会导致 x
列的更新。
你所有的
matched
条件似乎都归结为一个
when matched then update
set context=rt.context
,x=rt.x
,y=rt.y
,z=rt.z
如果您使用它,所有四列将立即更新。
有没有紧凑的 PostgreSQL 语法来编写
?幸运的是,不能有空值。WHEN MATCHED AND ((t.x != rt.x) OR (t.y != rt.y) OR (t.z != rt.z)) THEN UPDATE SET x=rt.x, y=rt.y, z=rt.z
您可以使用元组语法
when matched and (t.x,t.y,t.z)!=(rt.x,rt.y,rt.z)
,但它在性能方面并不严格等效。