2017-08-30 86 views
0

我想创建一个满足以下条件的查询:如果PostgreSQL的:测试,如果用户存在,否则创建新的用户返回他的身份证

得到一个用户名和电子邮件地址,

  • 测试的用户名或者电子邮件已被占用,如果没有,则INSERT INTO user_account(username,email_address,hash)
  • 返回(作为整数)user_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 

会不会有实现这一目标的一个更优雅的方式,而无需通过声明一个记录的麻烦会并有一个循环?

回答

2

你不需要循环只是将INSERT ... RETURNING的结果存储到变量中;

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; 
相关问题