从 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 顺便说一句:语言名称是一个标识符,所以请不要使用单引号plpgsql
或sql
,但不是@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;
BEGIN
和 END
是 PL/pgSQL 所必需的。 Details in the manual here.
不要使用过时的(这里是多余的)ALIAS FOR
语法。 It's discouraged in the manual. 您可以直接引用参数名称(也可以在 SQL 函数中,从 pg 9.2 开始)。
【讨论】:
在函数体中将参数称为$1
和$2
,而不是role
和from_role
有什么原因吗?
@Jay:在 Postgres 9.2+ 函数中都有效。 OP没有透露他的版本,所以位置参考是安全的选择。我的答案末尾有提示。更多:***.com/a/27116711/939860以上是关于从 SQL 函数返回布尔值的主要内容,如果未能解决你的问题,请参考以下文章
如何从订阅另一个函数的observable的函数返回布尔值?