为什么我的 BEGIN 命令在 SQL 上不起作用

Why isn't my BEGIN command working on SQL

提问人:IvanMafia 提问时间:4/18/2023 最后编辑:marc_sIvanMafia 更新时间:4/18/2023 访问量:80

问:

我有这段代码来创建一个函数。但它告诉我 BEGIN 中的命令是错误的

CREATE FUNCTION transform_activebool(activebool CHAR(1)) 
RETURNS VARCHAR(10)
BEGIN
    IF activebool = 't' THEN
        RETURN 'Active';
    ELSE
        RETURN 'Inactive';
    END IF;
END;

代码错误消息

我尝试移动语法并查看命令,但它不起作用。BEGIN

postgresql 语法 命令 语法错误

评论

0赞 nbk 4/18/2023
您需要使用并添加结尾DELIMITER $$DELIMITER ;
0赞 SelVazi 4/18/2023
这是哪个DBMS?
0赞 IvanMafia 4/18/2023
它在 postgreSQL /pgADmin 上
1赞 Laurenz Albe 4/18/2023
语法都是错误的。查看文档和其中的示例。
0赞 Adrian Klaver 4/18/2023
假设您正在尝试使用,请查看结构plpgsql

答:

0赞 RCoupy 4/18/2023 #1

试试这个:

CREATE FUNCTION transform_activebool(activebool CHAR(1)) 
RETURNS VARCHAR(10)
language plpgsql
as
$$
begin
    IF activebool = 't' THEN
        RETURN 'Active';
    ELSE
        RETURN 'Inactive';
    END if;
END;
$$
0赞 Frank Heikens 4/18/2023 #2

使用有效的语法。在这种情况下,您可以使用简单的 SQL 函数,使用 CASE 来选择正确的输出:

CREATE FUNCTION transform_activebool(activebool CHAR(1)) 
RETURNS VARCHAR(10)
LANGUAGE SQL -- you always have to define the language
STRICT -- RETURNS NULL on NULL input
IMMUTABLE -- always returns the same output for the same input
AS
$$ -- function body starts here:
    SELECT
        CASE 
            WHEN activebool = 't' 
                THEN 'Active'
            ELSE    'Inactive'
        END CASE;
$$; -- end of the function body

-- test:
SELECT transform_activebool('t') -- Active
    , transform_activebool('x') -- Inactive
    , transform_activebool(NULL); -- NULL

这个函数非常简单,不需要plpgsql语言,因此不需要BEGIN和END。