我有一张桌子,名字是member.我想创建一个函数,如果表中不存在新的邮箱,则插入该邮箱,然后返回一个布尔值.

CREATE OR REPLACE FUNCTION
  add_member(member_email TEXT)
RETURNS BOOLEAN AS
  $$
    BEGIN
        IF NOT EXISTS (SELECT email FROM "community".member WHERE email = $1) THEN
            INSERT INTO "community".member (email) VALUES ($1) RETURNING TRUE;
        ELSE
            RETURN FALSE;
        END IF;
    END;
  $$
LANGUAGE PLPGSQL;

SELECT add_member('cheese.head@green.org');

我得到了这个错误ERROR: query has no destination for result data. INSERT没有返回预期的数据吗?或者将其包装在另一种数据类型中?这就是你用INSERT退货的方式吗?

推荐答案

使用此处的INSERT ... RETURNING ... INTO:

https://www.postgresql.org/docs/current/plpgsql-statements.html#PLPGSQL-STATEMENTS-SQL-ONEROW

CREATE OR REPLACE FUNCTION
  add_member(member_email TEXT)
RETURNS BOOLEAN AS
  $$
    DECLARE
        return_val BOOLEAN := FALSE;
    BEGIN
        IF NOT EXISTS (SELECT email FROM "community".member WHERE email = $1) THEN
            INSERT INTO "community".member (email) VALUES ($1) RETURNING TRUE INTO return_val;
       
        END IF;
    RETURN return_val;
    END;
  $$
LANGUAGE PLPGSQL;

DECLAREreturn_val变量设置为boolean,默认为FALSE.然后测试现有值,如果存在,则执行DO INSERT,并使用从INSERT返回的TRUE值更新return_val变量.然后是RETURN return_val,如果找到现有的member_email,则为FALSE,如果没有找到,则为TRUE.

Sql相关问答推荐

Postgresql:从jsons数组到单个id索引的json

如何连接第二个表并将其内容输入到第一个表的单个字段中?

为表中每个缺少的引用创建新行

如何在不更改S代码的情况下,判断存储过程调用了多少次clr函数?

如何在snowflake中进行SQL的反向填充

如何从JSON数组中 Select 多个值

基于多列比较连接两个表

如何将`now()`作为SQL插入语句的一部分?

在查询Oracle SQL中创建替代ID

使用 Oracle SQL Developer 将不同的列值转换为列会导致错误 ORA-01489

使用 XML 作为 SQL 表

如何 for each id创建长度等于id长度的不同日期序列?

在Snowflake中如何使用SQL对版本字符串进行排序?

基于 Snowflake 的最大值创建新列

Oracle函数中无法动态迭代创建的SYS_REFCURSOR

使用in和and运算符过滤记录的条件

我现在如何显示重复的汽车? postgresql

PostgresQL-根据另一列找到 3 个最低值

使用 JSON_BUILD_OBJ 从 Postgres 返回 JSON

创建一个将层次 struct 级别放入列中的查询