【问题标题】:How to Create PostgreSQL UPSERT Function that Accessing CTE Table Inner IF Statement?如何创建访问 CTE 表内 IF 语句的 PostgreSQL UPSERT 函数?
【发布时间】:2019-07-12 11:23:26
【问题描述】:

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

错误:在“ON”处或附近出现语法错误

第 12 行:从冲突列表中选择 id 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
---+------

【问题讨论】:

    标签: postgresql function upsert


    【解决方案1】:

    您的代码有几个问题

    • 不需要 with 子句来运行 INSERT ON CONFLICT
    • 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;
    

    这是上述工作代码的demo

    【讨论】:

    • 好吧,谢谢 Nayak 先生,但对于我的真实情况,我需要: 1. CTE(带子句),因为我需要加入一些表并将其设为 CTE,然后选择 CTE 然后插入它到一个表 2. 我需要 IF Else 语句,因为在它之前我需要过滤一些我必须使用 IF Else 上面的函数的数据,就像我的函数的算法一样,我需要制作需要的 upsert 函数访问 CTE 内部 IF ELSE 子句语句.. 非常感谢 Nayak 先生,最诚挚的问候
    • 我是 postgreSQL 的新手,而且在它的功能中
    猜你喜欢
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多