PostgreSQL的:测试,如果用户存在,否则创建新的用户返回他的身份证
问题描述:
我想创建一个满足以下条件的查询:如果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
会不会有实现这一目标的一个更优雅的方式,而无需通过声明一个记录的麻烦会并有一个循环?
答
你不需要循环只是将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;