【发布时间】:2018-02-08 18:04:51
【问题描述】:
我正在尝试创建一个满足以下条件的查询:
给定用户名和电子邮件地址,
- 测试用户名或电子邮件是否已被占用,如果没有,则 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
是否有更优雅的方式来实现这一点,而无需经历声明记录和循环的麻烦?
【问题讨论】:
标签: sql postgresql plpgsql postgresql-9.1