Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL:测试用户是否存在,否则创建新用户并返回其id_Sql_Postgresql_Plpgsql_Postgresql 9.1 - Fatal编程技术网

PostgreSQL:测试用户是否存在,否则创建新用户并返回其id

PostgreSQL:测试用户是否存在,否则创建新用户并返回其id,sql,postgresql,plpgsql,postgresql-9.1,Sql,Postgresql,Plpgsql,Postgresql 9.1,我正在尝试创建满足以下条件的查询: 给定用户名和电子邮件地址 测试用户名或电子邮件是否已被占用,如果未被占用,则插入用户帐户(用户名、电子邮件地址、哈希) 返回(作为整数)user\u id如果成功,则返回新用户的用户名,-1如果用户名已被占用,-2如果电子邮件地址已被占用,-3如果两者都被占用(或确定出错原因的任何其他方法) 原子块 最优查询 到目前为止,我有以下功能: CREATE OR REPLACE FUNCTION add_user (character varying(40)

我正在尝试创建满足以下条件的查询:

给定用户名和电子邮件地址

  • 测试用户名或电子邮件是否已被占用,如果未被占用,则插入用户帐户(用户名、电子邮件地址、哈希)
  • 返回(作为整数)
    user\u id
    如果成功,则返回新用户的用户名,-1如果用户名已被占用,-2如果电子邮件地址已被占用,-3如果两者都被占用(或确定出错原因的任何其他方法)
  • 原子块
  • 最优查询
到目前为止,我有以下功能:

CREATE OR REPLACE FUNCTION add_user
  (character varying(40), character varying(255), character(60))
RETURNS integer
AS $body$
DECLARE
  id record;
BEGIN
  IF EXISTS(SELECT 0 FROM user_account WHERE username = $1 AND email_address = $2)
  THEN RETURN 3;
  ELSEIF EXISTS(SELECT 0 FROM user_account WHERE username = $1)
  THEN RETURN 1;
  ELSEIF EXISTS(SELECT 0 FROM user_account WHERE email_address = $2)
  THEN RETURN 2;
  ELSE FOR id IN INSERT INTO user_account (username, email_address, hash) values ($1, $2, $3) RETURNING user_id
       LOOP
         RETURN id;
       END LOOP;
  END IF;
  RETURN 0;
END;
$body$
LANGUAGE plpgsql
VOLATILE

有没有一种更优雅的方法来实现这一点,而不必经历声明记录和循环的麻烦?

您不需要循环,只需存储插入的结果。。。将返回到变量中

declare 
  id integer; -- use an integer variable
begin
    ...
    ELSE 
       INSERT INTO user_account (username, email_address, hash) values ($1, $2, $3) 
       RETURNING user_id 
       INTO id; --<< here
       return id;
    END IF;
end;
声明
id整数;--使用整数变量
开始
...
其他的
将值($1、$2、$3)插入用户帐户(用户名、电子邮件地址、哈希)
正在返回用户id
输入id--