在Postgres中返回json_build_object处理在delete语句中找不到记录

时间:2018-10-01 13:53:31

标签: postgresql

我在使用postgres函数时遇到了一些麻烦,在该函数中,我要删除行并返回不存在该行的json_build_object。

代码如下:

CREATE OR REPLACE FUNCTION DeleteXJSON(
    in_x_id BIGINT)
    RETURNS SETOF JSON AS
$BODY$
  DECLARE
    ref_json_data   JSON;
  BEGIN
    DELETE FROM xtable WHERE x_id = in_x_id
        RETURNING json_build_object('x_id', x_id) INTO ref_json_data;
    RETURN QUERY (select ref_json_data);
  END
$BODY$
  LANGUAGE plpgsql

当找到要删除的行时,这很好用,但是当找不到行时,它最终返回1行而不是预期的0行。

我简化了json_build_object字段,因为实际上我在其中返回了许多字段。我如何正确处理此问题,以便0行不存在时返回?如果有更好的方法来解决此问题,请告诉我。

更新#1:

我修复了伪造的END IF。但是,如果我通过psql运行此命令:

select * from deletexjson(1);

我得到以下信息:

 deletecampjson 
 ----------------

 (1 row)

1 个答案:

答案 0 :(得分:2)

eurotrashS-Man指出的错误是流浪END IF

但是,如当前所述,不需要将已删除的行的json存储到ref_json_data中。也没有任何程序元素。也就是说,您可以编写一个SQL函数而不是PLPGSQL函数:

CREATE OR REPLACE FUNCTION deletexjson (xid BIGINT)
    RETURNS SETOF JSON AS 
    $$
        DELETE FROM xtable WHERE x_id = xid
            RETURNING JSON_BUILD_OBJECT('x_id', x_id, 'x_rand', x_rand);
    $$
LANGUAGE SQL

表示相同逻辑的较短表达(可能更快的评估)。