从 SQL 函数返回布尔值

Posted

技术标签:

【中文标题】从 SQL 函数返回布尔值【英文标题】:Returning boolean from SQL function 【发布时间】:2014-12-02 21:21:54 【问题描述】:

我正在尝试在 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);
 $$;

函数 first_predicate 和 second_predicate 存在并返回布尔值,但我没有得到太多帮助,因为它们是用类似的东西定义的

SELECT COUNT(*) > 0 FROM ... WHERE ...

我收到以下语法错误:

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

所以显然我在这里误解了一些相当基本的东西。我对整个 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';

仍然希望得到一个答案来解释为什么后者有效而前者(即使按照@a_horse_with_no_name 的建议将语言更改为plpgsql)不能,或提供一些有用的教程。

【问题讨论】:

你的函数定义为language sql。 sql中没有return语句,只有PL/pgSQL中 @a_horse_with_no_name 我将language sql 更改为langauge plpgsql,同样的错误。 language sql 一起使用:sqlfiddle.com/#!15/7cf4a/1 和plpgsql:sqlfiddle.com/#!15/90f62/1 顺便说一句:语言名称是一个标识符,所以请不要使用单引号plpgsqlsql,但不是@987654336 @ @a_horse_with_no_name 抱歉,我在做其他愚蠢的事情。谢谢。 【参考方案1】:

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;

SELECT。普通 SQL 中没有 RETURN。 Details in the manual here.

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;

BEGINEND 是 PL/pgSQL 所必需的。 Details in the manual here.

不要使用过时的(这里是多余的)ALIAS FOR 语法。 It's discouraged in the manual. 您可以直接引用参数名称(也可以在 SQL 函数中,从 pg 9.2 开始)。

【讨论】:

在函数体中将参数称为$1$2,而不是rolefrom_role 有什么原因吗? @Jay:在 Postgres 9.2+ 函数中都有效。 OP没有透露他的版本,所以位置参考是安全的选择。我的答案末尾有提示。更多:***.com/a/27116711/939860

以上是关于从 SQL 函数返回布尔值的主要内容,如果未能解决你的问题,请参考以下文章

从 oracle 函数返回布尔值

如何从 Javascript 中的连续函数返回布尔值?

初学者问题:从 Python 中的函数返回布尔值

如何从订阅另一个函数的observable的函数返回布尔值?

如何将从函数返回的布尔值分配给 PostgreSQL 9.4 中的变量?

没有在布尔函数中获取/设置正确的返回值