2

我正在尝试在 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 语句的函数示例,所以我不知道我做错了什么。任何帮助,将不胜感激。

4

3 回答 3

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 函数中执行的操作通常应该在其中执行。您将获得更好的性能,并且计划者可以用它做更多的事情。

于 2013-03-13T12:13:54.057 回答
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;
于 2013-03-13T12:15:56.157 回答
1

SQL

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$

PL/pgSQL

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( xbeing text) 只排除''and NULL。使用 100% 等效表达式 x <> ''。无论函数是否声明,都一样简单快捷STRICT

  • 如果不需要,请不要使用plpgsql 。ALIAS它只是为了兼容性和重命名预先确定的参数名称。本手册强烈反对将其用于其他目的。我从不使用它。命名参数从 8.1 版开始可用。更简单,更好。
    从 PostgreSQL 9.2 开始,在 SQL 函数中,您可以引用参数名称(而不是位置参数 ( $1, $2, ..)。在此之前命名参数仍然是一个好主意,以获取文档。

  • 怀疑不想声明这个函数STRICT(同义词RETURNS NULL ON NULL INPUT:)。就像同义词所暗示的那样,返回NULL(任何)NULL输入。似乎您想要一个空字符串 ( '') 代替。还有一个性能影响:
    没有 STRICT 修饰符的函数执行得更快?

于 2013-03-13T17:07:50.120 回答