我正在尝试在PostgreSQL 9.0中编写一个函数。这将最终用于新的聚合函数,但一次只能使用一步。 以下是我到目前为止的情况:
create or replace function encstate(text,text) returns text as $$
DECLARE
oldstate alias for $1;
arg alias for $2;
BEGIN
IF length(oldstate)>0 then
select 'Encrypted';
else if
select '';
end if;
END;
$$ language sql strict immutable;
(我知道我还没有使用$ 2参数。)
结果是:
ERROR: syntax error at or near "alias"
LINE 3: oldstate alias for $1;
当我删除DECLARE
块并在体内引用$ 1等参数时,结果为:
ERROR: syntax error at or near "if"
LINE 3: if length($1)>0 then
据我所知,我在网上找到了匹配的例子,除了我找不到带有if语句的函数的例子,所以我不知道我做错了什么。任何帮助将不胜感激。
答案 0 :(得分:2)
我建议将其作为SQL函数执行:
create or replace function encstate(text,text) returns text as $$
SELECT CASE WHEN length($1)>0 then 'Encrypted' ELSE '' END;
$$ language sql strict immutable;
您也可以使用其他方法执行操作,但将sql更改为plpgsql。我的建议是,你可以在一个SQL函数中做什么,你应该通常在一个。您将获得更好的性能,规划人员可以使用它做更多的事情。
答案 1 :(得分:1)
如果你想要一个SQL函数:
create or replace function encstate(text, text) returns text as $$
select case
when length($1) > 0 then 'Encrypted'
else ''
end
;
$$ language sql strict immutable;
SQL没有变量或控制结构,因为它不是程序性的,它是声明性的。如果你想要程序功能,那么使用plpgsql函数:
create or replace function encstate(text, text) returns text as $$
DECLARE
oldstate alias for $1;
arg alias for $2;
BEGIN
IF length(oldstate) > 0 then
return 'Encrypted';
else
return '';
end if;
END;
$$ language plpgsql strict immutable;
答案 2 :(得分:1)
CREATE OR REPLACE FUNCTION encstate(oldstate text, arg text)
RETURNS text LANGUAGE SQL IMMUTABLE AS
$func$
SELECT CASE WHEN $1 <> '' THEN 'Encrypted' ELSE '' END
$func$
CREATE OR REPLACE FUNCTION encstate(oldstate text, arg text)
RETURNS text LANGUAGE plpgsql IMMUTABLE AS
$func$
BEGIN
IF oldstat <> '' THEN
RETURN 'Encrypted';
ELSE
RETURN '';
END IF;
END
$func$;
表达式length(x) > 0
(x
为text
)仅排除''
和NULL
。
使用100%等效表达式x <> ''
。无论函数是否声明为STRICT
,都会更简单,更快捷。
如果您不需要,请不要使用plpgsql ALIAS
。它仅用于兼容性和重命名预定义的参数名称。该手册积极阻止其用于其他目的。我从不使用它。自8.1版起,命名参数可用。更简单,更好
在SQL函数中,您可以引用参数名称(而不是位置参数($1
,$2
,..),因为PostgreSQL 9.2。在此之前,为文档命名参数仍然是一个好主意。< / p>
我怀疑你做不想宣布这个函数STRICT
(synonym: RETURNS NULL ON NULL INPUT
)。与同义词暗示一样,它会在(任意)NULL
输入上返回NULL
。好像你想要一个空字符串(''
)。
还有表现意义:
Function executes faster without STRICT modifier?