如何创建访问CTE表内部IF语句的PostgreSQL UPSERT函数?

时间:2019-02-19 02:35:49

标签: postgresql function upsert

我想创建访问CTE表内部IF子句的upsert函数,但发现错误:

  

错误:“ ON”或附近的语法错误

     

第12行:SELECT id,从CONFLICT列表中选择999(id)                                        ^

     

**********错误**********

     

错误:“ ON”或附近的语法错误SQL状态:42601字符:346

hasil_perhitungan表中的数据:

----------
id + hasil
---+------
21 + 666
22 + 777
23 + 777
24 + 777
25 + 777
---+------

list_di中的数据:

---
id 
---
19
20
21
---

我必须尝试:

postgres syntax error at or near "ON"

UPSERT Postgres 9.5

CREATE OR REPLACE FUNCTION coba(input_data integer)
  RETURNS void AS
  $BODY$
BEGIN
IF EXISTS (SELECT id, CASE WHEN id = input_data THEN 'OK' END FROM hasil_perhitungan)
    THEN 
    WITH result AS (
    SELECT id FROM hasil_perhitungan)
    , list AS (
    SELECT id FROM list_di)
    INSERT INTO hasil_perhitungan 
    SELECT id , 999 FROM list ON CONFLICT (id)
        UPDATE SET hasil = 888;
END IF;
END;
$BODY$
LANGUAGE plpgsql;

当我用IF语句和可以访问IF语句内部的CTE表的整数参数执行函数时,我曾期望过。所以 当我用:

运行功能时
SELECT coba(25);

该函数将插入并更新,因此我得到:

Data in hasil_perhitungan table :

----------
id + hasil
---+------
19 + 999
20 + 999
21 + 888
22 + 777
23 + 777
24 + 777
25 + 777
---+------

1 个答案:

答案 0 :(得分:0)

您的代码有几个问题

  • 无需使用with子句来运行DO
  • 您的查询中缺少
  • IF EXISTS关键字
  • 您可能不需要使用EXISTS条件,因为这意味着您将始终需要更新而不插入。即使您需要它,也不是编写IF EXISTS ( SELECT 1 FROM hasil_perhitungan WHERE id = input_data ) THEN支票的正确方法,应该像这样:

CREATE OR REPLACE FUNCTION coba(input_data integer) RETURNS void AS $BODY$ BEGIN INSERT INTO hasil_perhitungan SELECT id , 999 FROM list_di ON CONFLICT (id) DO UPDATE SET hasil = 888; END; $BODY$ LANGUAGE plpgsql;

也许这个简单的功能足以满足您的要求。

 it('remove existing subdocument', function(done) {
         this.timeout(10000);
      //your code is here
      done();
    });

以下是上述工作代码的 demo