2017-08-30 3 views
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 

はこれを達成するための、よりエレガントな方法は、レコードを宣言するの手間を経由せずに存在することになりますループを持っている?

答えて

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; 
関連する問題