Postgres:与CASE一起使用ON CONFLICT

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Postgres:与CASE一起使用ON CONFLICT相关的知识,希望对你有一定的参考价值。

我试图确定我应该使用的确切语法与CASE一起进行ON CONFLIC。

我有一张桌子(忽略id,这里没有关系):

CREATE TABLE public.test (
    id integer NOT NULL,
    mykey integer,
    t text,
);

约束条件mykey必须是唯一的

ALTER TABLE test
ADD CONSTRAINT test_constraint UNIQUE (mykey);

让我们用一些播放条目填充它:

INSERT INTO test (mykey,t) VALUES (123,'my first value');
INSERT INTO test (mykey,t) VALUES (13,'second value');

现在我想制作一个使用ON CONFLICT和CASE的INSERT语句,以便:如果t的新值等于旧值,则不执行任何操作,否则更新。

这是我到目前为止所拥有的:

INSERT INTO test (mykey,t) VALUES (123,'a new value') 
ON CONFLICT ON CONSTRAINT test_constraint 
DO CASE t
WHEN excluded.t THEN NOTHING
ELSE UPDATE SET t=excluded.t;
END;

我收到一条错误消息

ERROR:  syntax error at or near "case"
LINE 3: do case t
           ^
WARNING:  there is no transaction in progress

我收到错误消息并不奇怪,因为如果我在第一次尝试时得到即兴声明,那会不会很奇怪? ;-)

但是,应该可以这样做(假设语法正确),或其他相同的效果。我知道如何做冲突没事,冲突更新,以及案例/时间/过程。应该可以将它们全部一起使用。

编辑:我将更新我尝试过但没有工作的变化

INSERT INTO test (mykey,t) VALUES (123,'a new value') 
ON CONFLICT ON CONSTRAINT test_constraint 
CASE t
WHEN excluded.t THEN DO NOTHING
ELSE DO UPDATE SET t=excluded.t;
END;

(同样的错误)

答案

您可以在qazxsw poi子句中使用条件。 qazxsw poi做了比较

WHERE

IS DISTINCT FROM

以上是关于Postgres:与CASE一起使用ON CONFLICT的主要内容,如果未能解决你的问题,请参考以下文章

遇到致命问题:使用 ruby​​ on rails 对用户“postgres”进行对等身份验证失败

Postgres DISTINCT 与 DISTINCT ON 有啥区别?

无法将 postgres 与 keycloak 一起使用

将 Postgres 与 Grails 一起使用

将 Async/Await 与 node-postgres 一起使用

postgres:在 WHERE 子句中使用 CASE 和 ANY()