Postgresql INSERT命令后从SQL函数返回布尔值

Postgresql INSERT命令后从SQL函数返回布尔值,postgresql,Postgresql,我有一个简单的函数来更新表中的列。我想返回布尔值以指示更新是否成功 以下是函数: CREATE OR REPLACE FUNCTION api.file_confirm_upload_to_s3(_file_guid uuid ) RETURNS bool AS $BODY$ UPDATE main.file SET is_uploaded_to_s3 = true WHERE guid = _file_guid RETURNING CASE WHEN guid IS NULL

我有一个简单的函数来更新表中的列。我想返回布尔值以指示更新是否成功

以下是函数:

CREATE OR REPLACE FUNCTION api.file_confirm_upload_to_s3(_file_guid uuid )
RETURNS bool AS 
$BODY$
  UPDATE main.file
  SET is_uploaded_to_s3 = true
  WHERE guid = _file_guid
  RETURNING CASE WHEN guid IS NULL THEN false ELSE true END
$BODY$
  LANGUAGE SQL
  VOLATILE
  SECURITY DEFINER;
函数在成功更新后返回TRUE,但在更新失败后返回NULL。Null是错误的,所以它对我来说是有效的,但我确实想知道如何更清楚地解决这个问题

不成功的更新将返回一个空数据集,该数据集将生成NULL,因此返回值为空。如何测试空数据集与非空数据集,而不是检查guid字段的值


在JGH的回答后编辑。。 这是我想要的代码。我必须切换到plpgsql才能访问
FOUND
变量

CREATE OR REPLACE FUNCTION api.file_confirm_upload_to_s3(_file_guid uuid )
RETURNS bool AS 
$BODY$
BEGIN
  UPDATE main.file
  SET is_uploaded_to_s3 = true
  WHERE guid = _file_guid;

  RETURN FOUND;
END;
$BODY$
  LANGUAGE plpgsql
  VOLATILE
  SECURITY DEFINER;

只需使用
returnfound
此特殊变量包含一个布尔值,指示是否使用上一个查询找到了一行或多行。

阅读文档41.5.5和示例41-2。

您也可以在
SQL
模式下执行此操作

...
with c as( -- put your update into cte
    UPDATE main.file
    SET is_uploaded_to_s3 = true
    WHERE guid = _file_guid
    RETURNING guid 
)
select exists(select guid from c);
...

非常感谢。我必须切换到plpgsql才能访问找到的变量。我用最终代码更新了我的问题,供其他人查找。谢谢。我更喜欢更干净的plpgsql解决方案。但我会记住这个把戏。