从SQL函数返回布尔值

jjm*_*jjm 5 sql postgresql stored-procedures plpgsql

我正在尝试在postgres中编写PL/pgSQL函数,返回一个布尔表达式.目前代码如下所示:

CREATE OR REPLACE FUNCTION is_visible_to(role integer, from_role integer)
  RETURNS boolean
  LANGUAGE SQL STABLE STRICT AS $$
    RETURN $1 = $2 OR first_predicate($1, $2) OR second_predicate($2, $1);
 $$;
Run Code Online (Sandbox Code Playgroud)

函数first_predicate和second_predicate存在并返回布尔值,但是我没有得到很多帮助来查看它们,因为它们的定义类似于

SELECT COUNT(*) > 0 FROM ... WHERE ...
Run Code Online (Sandbox Code Playgroud)

我收到以下语法错误:

ERROR:  syntax error at or near "RETURN"
LINE 4:     RETURN $1 = $2 first_predicate($1, $2) OR second_predicate(...
            ^
Run Code Online (Sandbox Code Playgroud)

显然我在这里误解了一些相当重要的东西.我对整个PL/pgSQL事情都不熟悉,所以也可以赞赏一两个好教程的链接.

我正在开发的项目专门使用postgres,并且已经包含了很多postgres特定的代码,因此解决方案不必移植到其他数据库.

编辑: 修正了我自己

CREATE FUNCTION is_visible_to (role integer, from_role integer)
  RETURNS BOOLEAN AS '
    DECLARE
        role ALIAS FOR $1;
        from_role ALIAS FOR $2;
    BEGIN
      RETURN (role = from_role) OR
             first_predicate(from_role, role) OR
             second_predicate(from_role, role)
    END;
' LANGUAGE 'plpgsql';
Run Code Online (Sandbox Code Playgroud)

仍然会有一个答案可以解释为什么后来的作品和前者(即使语言改变plpgsql为@a_horse_with_no_name所建议的那样)没有,或提供一些有用的教程.

Erw*_*ter 5

SQL

CREATE OR REPLACE FUNCTION is_visible_to(role integer, from_role integer)
  RETURNS boolean AS
$func$
   SELECT $1 = $2 OR first_predicate($1, $2) OR second_predicate($2, $1);
$func$ LANGUAGE sql STABLE STRICT;
Run Code Online (Sandbox Code Playgroud)

随着SELECT.RETURN在纯SQL中没有.手册中的详细信息在这里.

PL/pgSQL的

CREATE OR REPLACE FUNCTION is_visible_to(role integer, from_role integer)
  RETURNS boolean AS
$func$
BEGIN
   RETURN $1 = $2 OR first_predicate($1, $2) OR second_predicate($2, $1);
END
$func$ LANGUAGE plpgsql STABLE STRICT;
Run Code Online (Sandbox Code Playgroud)

BEGIN并且END是PL/pgSQL所必需的.手册中的详细信息在这里.

不要使用过时(和冗余)ALIAS FOR语法.在手册中不鼓励它.您可以直接引用参数名称(在SQL函数中也是如此,因为第9.2页).

  • @Jay:在Postgres 9.2+函数中都有效。OP没有透露他的版本,因此位置推荐是正确的选择。我的回答有一个提示。更多:http://stackoverflow.com/a/27116711/939860 (2认同)