2015-10-18 93 views
1

如何從使用case語句的用戶定義函數中設置值(或直接返回值)?plpgsql中的case語句返回值

create function is_bar(email varchar) returns boolean as 
$$ 
declare returnValue boolean; 
begin 
    select case when exists 
    (select * from (users join user_roles on users.userID = user_roles.userID) 
    where user_email=email and user_role='bar') 
    then (returnValue := TRUE); 
    else (returnValue := FALSE); 
    end; 
    return returnValue; 
end; 
$$ language plpgsql; 

給我:

ERROR: syntax error at or near ":=" 
LINE 8: then (returnValue := TRUE); 
+1

你可以分配一個這樣的變量。你需要使用PL/pgSQL的'select into':http://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-SQL-ONEROW –

+0

@a_horse_with_no_name感謝您的支持 – beoliver

回答

2

這將是更容易返回exists運營商本身的結果:

CREATE FUNCTION is_bar(email VARCHAR) RETURNS BOOLEAN AS 
$$ 
BEGIN 
    RETURN EXISTS (SELECT * 
       FROM users 
       JOIN user_roles ON users.userID = user_roles.userID 
       WHERE user_email = email AND user_role='bar') 
END; 
$$ LANGUAGE plpgsql; 
+0

這會更容易。我會標記爲已回答,但出於興趣,爲什麼我當前的功能失敗? – beoliver

1

描述問題的原因是SQL的變化(功能)CASE聲明和PLpgSQL(程序)CASE聲明。

的SQL CASE(功能):

BEGIN 
    RETURN CASE WHEN EXISTS(..) 
       THEN true /* value */ 
       ELSE false END; /* ended by END */ 
END; 

的PLPGSQL(程序)CASE

BEGIN 
    CASE WHEN EXISTS(..) 
    THEN 
     RETURN true; /* statement */ 
    ELSE 
     RETURN false; 
    END CASE; /* ended by END CASE */ 
END; 

還有一些其他的例子(相同的結果):

a := CASE WHEN b < 10 THEN true ELSE false END; 
a := b < 10; 
CASE WHEN b < 10 THEN 
    a := true; 
ELSE 
    a := false; 
END CASE;