sql - 编写一个 PL/pgSQL 函数,以便在找到 "nothing"时不设置 FOUND?

标签 sql function postgresql stored-procedures plpgsql

我刚刚开始使用 PostgreSQL 中的函数,这可能是非常基础的,但这是如何完成的?

我希望能够在函数中使用以下内容:

PERFORM id_exists();
IF FOUND THEN
   -- Do something
END IF;

id_exists() 函数(与 SELECT 和 PERFORM 一起使用)是:

CREATE OR REPLACE FUNCTION id_exists() RETURNS int AS $$
DECLARE
  my_id int;
BEGIN
  SELECT id INTO my_id
  FROM tablename LIMIT 1;
  RETURN my_id;
END;
$$ LANGUAGE plpgsql;

目前,即使 my_id 不存在于表中,FOUND 为真,大概是因为仍在返回一行(空整数)?如何重写,以便在找到时返回一个整数,否则什么也没有?

最佳答案

您的假设是正确的,如果最后一条语句返回一行,则 FOUND 设置为 TRUE,而不管值(可能是 NULL在你的情况下)。手册中的详细信息here .

例如重写为:

IF id_exists() IS NOT NULL THEN
   -- Do something
END IF;

或者SETOF重写你的函数的返回值,这样它就可以返回多行——或者没有行!像我演示的那样使用 RETURN QUERY。您可以在您的原始设置中使用此功能。

CREATE OR REPLACE FUNCTION id_exists()
  RETURNS SETOF int LANGUAGE plpgsql AS
$BODY$
BEGIN
  RETURN QUERY
  SELECT id
  FROM   tablename
  LIMIT  1;
END;
$BODY$;

或者,使用语言SQL函数更简单:

CREATE OR REPLACE FUNCTION id_exists()
  RETURNS SETOF int LANGUAGE sql AS
$BODY$
  SELECT id
  FROM   tablename
  LIMIT  1;
$BODY$;

关于sql - 编写一个 PL/pgSQL 函数,以便在找到 "nothing"时不设置 FOUND?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11126924/

相关文章:

sql - 选择所有参与过所有选举的用户

arrays - 将简单代码集成到复杂代码中

java - 将 PostgreSQL bytea-stored serialized-java-UUID 转换为 postgresql-UUID

python - 如何在 SQLAlchemy for PostgreSQL 中设置事务隔离级别?

java - HIbernate 一对一注释不会在从属表中生成外键 GerericGenerator

sql - 聚集索引 - 多部分索引与单部分索引以及插入/删除的影响

c# - SqlDataReader 是否将所有内容存储为字符串?

c# - 另一个缩短SQL字符串? C#

javascript - 在Typescript中将类方法作为参数传递

php - jQuery PHP 在函数内传递值与实时点击?