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 而不是 plpgsqlplpgsql 是一种特定于 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$