Return 来自 Hasura PostgreSQL 函数的布尔值
Return boolean from Hasura PostgreSQL function
我有一个订阅 table,我想在 table 上添加一个名为 is_subscription_active
的字段作为计算字段。在查看了一些示例后,我写了一个函数 return 来自 PostgreSQL 函数的布尔值,但我似乎无法弄清楚这里的问题。
CREATE OR REPLACE FUNCTION public.is_subscription_active(sub subscriptions)
RETURNS BOOLEAN
LANGUAGE sql
STABLE
AS $function$
IF (sub.subscription_status = 'active') THEN
RETURN true;
ELSE
IF (sub.subscription_status != 'cancelled') THEN
RETURN false;
ELSE
IF sub.ending_date > now() THEN
RETURN true;
ELSE
RETURN false;
END IF;
END IF;
END IF;
$function$
我的逻辑是,我得到 sub
(这将是 subscriptions
table 的一行),我只是检查状态是否处于活动状态然后 return true, else if it's cancelled, 然后检查结束日期是否大于现在,如果是 return true, else false.
我从 Hasura 那里得到这个错误。
{
"statement": "CREATE OR REPLACE FUNCTION public.is_subscription_active(sub subscriptions)\n RETURNS BOOLEAN\n LANGUAGE sql\n STABLE\nAS $function$\n IF (sub.subscription_status = 'active') THEN\n RETURN true;\n ELSE\n IF (sub.subscription_status != 'canceled') THEN\n RETURN false;\n ELSE\n IF sub.ending_date > now() THEN\n RETURN true;\n ELSE\n RETURN false;\n END IF;\n END IF;\n END IF;\n$function$;",
"prepared": false,
"error": {
"exec_status": "FatalError",
"hint": null,
"message": "syntax error at or near \"IF\"",
"status_code": "42601",
"description": null
},
"arguments": []
}
我也试过将函数体包装在 BEGIN ... END
块中,但我仍然遇到同样的错误。
显然,我在这里遗漏了一些基本的东西,但我不知道是什么
这里的主要问题是您指定的函数语言是 sql
而不是 plpgsql
。 plpgsql
是一种特定于 postgres 的过程语言,它实际上允许您使用过程编码模式,如条件语句和循环。常规 sql
.
不支持这些
以下应该适合您:
CREATE OR REPLACE FUNCTION public.is_subscription_active(sub subscriptions)
RETURNS BOOLEAN
LANGUAGE plpgsql
STABLE
AS $function$
BEGIN
IF (sub.subscription_status = 'active') THEN
RETURN true;
ELSE
IF (sub.subscription_status != 'cancelled') THEN
RETURN false;
ELSE
IF sub.ending_date > now() THEN
RETURN true;
ELSE
RETURN false;
END IF;
END IF;
END IF;
END;
$function$
我有一个订阅 table,我想在 table 上添加一个名为 is_subscription_active
的字段作为计算字段。在查看了一些示例后,我写了一个函数 return 来自 PostgreSQL 函数的布尔值,但我似乎无法弄清楚这里的问题。
CREATE OR REPLACE FUNCTION public.is_subscription_active(sub subscriptions)
RETURNS BOOLEAN
LANGUAGE sql
STABLE
AS $function$
IF (sub.subscription_status = 'active') THEN
RETURN true;
ELSE
IF (sub.subscription_status != 'cancelled') THEN
RETURN false;
ELSE
IF sub.ending_date > now() THEN
RETURN true;
ELSE
RETURN false;
END IF;
END IF;
END IF;
$function$
我的逻辑是,我得到 sub
(这将是 subscriptions
table 的一行),我只是检查状态是否处于活动状态然后 return true, else if it's cancelled, 然后检查结束日期是否大于现在,如果是 return true, else false.
我从 Hasura 那里得到这个错误。
{
"statement": "CREATE OR REPLACE FUNCTION public.is_subscription_active(sub subscriptions)\n RETURNS BOOLEAN\n LANGUAGE sql\n STABLE\nAS $function$\n IF (sub.subscription_status = 'active') THEN\n RETURN true;\n ELSE\n IF (sub.subscription_status != 'canceled') THEN\n RETURN false;\n ELSE\n IF sub.ending_date > now() THEN\n RETURN true;\n ELSE\n RETURN false;\n END IF;\n END IF;\n END IF;\n$function$;",
"prepared": false,
"error": {
"exec_status": "FatalError",
"hint": null,
"message": "syntax error at or near \"IF\"",
"status_code": "42601",
"description": null
},
"arguments": []
}
我也试过将函数体包装在 BEGIN ... END
块中,但我仍然遇到同样的错误。
显然,我在这里遗漏了一些基本的东西,但我不知道是什么
这里的主要问题是您指定的函数语言是 sql
而不是 plpgsql
。 plpgsql
是一种特定于 postgres 的过程语言,它实际上允许您使用过程编码模式,如条件语句和循环。常规 sql
.
以下应该适合您:
CREATE OR REPLACE FUNCTION public.is_subscription_active(sub subscriptions)
RETURNS BOOLEAN
LANGUAGE plpgsql
STABLE
AS $function$
BEGIN
IF (sub.subscription_status = 'active') THEN
RETURN true;
ELSE
IF (sub.subscription_status != 'cancelled') THEN
RETURN false;
ELSE
IF sub.ending_date > now() THEN
RETURN true;
ELSE
RETURN false;
END IF;
END IF;
END IF;
END;
$function$