0
を返す新しいユーザーを作成し、他の存在する場合、テストは、私は次を満たすクエリを作成しようとしています:ユーザ名とメールアドレスが与えられのPostgreSQL:ユーザーが自分のID
、
- テストをユーザ名の場合または電子メールがすでに取得されている場合は、INSERT INTO user_account(username、email_address、hash)
- 新しいユーザーの場合は
user_id
、成功した場合は新しいユーザーのuser_id
、ユーザー名がすでに取得されている場合は-1、電子メールアドレスは既に取られています。もし両方が取られれば-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
はこれを達成するための、よりエレガントな方法は、レコードを宣言するの手間を経由せずに存在することになりますループを持っている?