我有一个postgressql查询,我想在那里执行upsert。我的 pk1, pk2
列是复合主键。我想更新3列 dk1, dk2, timek
如果与主键约束冲突。当我更新冲突列时,比如 timek
列,然后我需要检查新值是否小于旧值,并相应地选择是否需要使用旧值或新值。这是我的查询,但它抛出错误。我是postgresql的新手,有什么问题吗?
INSERT INTO data_reports (pk1, pk2, dk1, dk2, dk3, timek, valuek) VALUES (?, ?, ?, ?, ?, ?, ?)
ON CONFLICT (pk1, pk2) DO UPDATE SET
dk1 = EXCLUDED.dk1,
dk2 = CASE WHEN (dk2 < EXCLUDED.dk2) THEN EXCLUDED.dk2 ELSE dk2 END), // I believe dk2 (existing value in DB) is not selected but how to do that
timek = CASE WHEN (timek < EXCLUDED.timek) THEN EXCLUDED.timek ELSE timek END);
2条答案
按热度按时间e3bfsja21#
您可以通过指定表名来引用更新前的列值:例如。
data_reports.dk2
.开括号和闭括号,共有5个
(
s和7)
s。开始评论
--
,或用/*
以及*/
.li9yvcax2#
仅供参考:您可以通过用最少的函数替换case表达式来简化: