我想创建访问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"
和
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
---+------
答案 0 :(得分:0)
您的代码有几个问题
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