【发布时间】:2018-10-01 13:53:30
【问题描述】:
我在删除一行并返回该行不存在的 json_build_object 的 postgres 函数时遇到了一些问题。
代码如下:
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)
【问题讨论】:
-
重新检查你的代码;你有一个
END IF没有开口IF。 -
(删除你后
END IF;)为我工作:dbfiddle.uk/… -
只是关于样式的一般说明,postgresql 中的对象名称(表、视图、函数、触发器等)不区分大小写除非用双引号括起来,否则带引号的名称被隐式转换为小写。在 postgresql 中最常见的样式是带下划线的不带引号的小写。
-
更新了我的问题以修复虚假的 END IF,如前所述。对于那个很抱歉。我将尝试下面的答案,看看是否有帮助。
标签: postgresql