Function 正在尝试编写PostgreSQL 9.0函数
我正试图在PostgreSQL 9.0中编写一个函数。这最终将用于一个新的聚合函数,但每次只执行一步。 以下是我到目前为止的情况: 创建或替换函数encstatetext,text返回文本作为$$ 声明 oldstate别名1美元; arg别名为$2; 开始 如果lengtholdstate>0,则 选择“加密”; 否则如果 选择 如果结束; 终止 $$语言sql严格不可变; 我知道我还没有使用$2参数 结果是:Function 正在尝试编写PostgreSQL 9.0函数,function,postgresql,plpgsql,Function,Postgresql,Plpgsql,我正试图在PostgreSQL 9.0中编写一个函数。这最终将用于一个新的聚合函数,但每次只执行一步。 以下是我到目前为止的情况: 创建或替换函数encstatetext,text返回文本作为$$ 声明 oldstate别名1美元; arg别名为$2; 开始 如果lengtholdstate>0,则 选择“加密”; 否则如果 选择 如果结束; 终止 $$语言sql严格不可变; 我知道我还没有使用$2参数 结果是: ERROR: syntax error at or near "alias" L
ERROR: syntax error at or near "alias"
LINE 3: oldstate alias for $1;
ERROR: syntax error at or near "if"
LINE 3: if length($1)>0 then
当我删除DECLARE块并在正文中将参数引用为$1等时,结果是:
ERROR: syntax error at or near "alias"
LINE 3: oldstate alias for $1;
ERROR: syntax error at or near "if"
LINE 3: if length($1)>0 then
据我所知,我所拥有的与web上的示例相匹配,只是我找不到带有if语句的函数示例,所以我不知道我做错了什么。任何帮助都将不胜感激。我建议将此作为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;
create or replace function encstate(text, text) returns text as $$
select case
when length($1) > 0 then 'Encrypted'
else ''
end
;
$$ language sql strict immutable;
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;
您也可以像对另一个那样做,但是将sql更改为plpgsql。不过,我的建议是,在SQL函数中可以做的事情通常应该在SQL函数中完成。您将获得更好的性能,计划者可以利用它做更多的工作。我建议将此作为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;
create or replace function encstate(text, text) returns text as $$
select case
when length($1) > 0 then 'Encrypted'
else ''
end
;
$$ language sql strict immutable;
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;
您也可以像对另一个那样做,但是将sql更改为plpgsql。不过,我的建议是,在SQL函数中可以做的事情通常应该在SQL函数中完成。您将获得更好的性能,计划者可以利用它做更多的工作。如果您想要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;
create or replace function encstate(text, text) returns text as $$
select case
when length($1) > 0 then 'Encrypted'
else ''
end
;
$$ language sql strict immutable;
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;
SQL没有变量或控制结构,因为它不是过程性的,而是声明性的。如果需要程序功能,请使用plpgsql函数:
create or replace function encstate(text,text) returns text as $$
SELECT CASE WHEN length($1)>0 then 'Encrypted' ELSE '' END;
$$ language sql strict immutable;
create or replace function encstate(text, text) returns text as $$
select case
when length($1) > 0 then 'Encrypted'
else ''
end
;
$$ language sql strict immutable;
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;
如果需要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;
create or replace function encstate(text, text) returns text as $$
select case
when length($1) > 0 then 'Encrypted'
else ''
end
;
$$ language sql strict immutable;
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;
SQL没有变量或控制结构,因为它不是过程性的,而是声明性的。如果需要程序功能,请使用plpgsql函数:
create or replace function encstate(text,text) returns text as $$
SELECT CASE WHEN length($1)>0 then 'Encrypted' ELSE '' END;
$$ language sql strict immutable;
create or replace function encstate(text, text) returns text as $$
select case
when length($1) > 0 then 'Encrypted'
else ''
end
;
$$ language sql strict immutable;
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;
SQL
PL/pgSQL
要点
表达式lengthx>0 x为纯文本,不包括和NULL。
使用100%等效表达式x。无论函数是否声明为严格函数,都可以更简单、更快地执行相同的操作
如果不需要,就不要使用。它只是为了兼容性和重命名预先确定的参数名。本手册积极劝阻将其用于其他目的。我从不使用它。命名参数自8.1版起可用。越简单越好。
在SQL函数中,可以引用参数名,而不是位置参数$1、$2、。。从PostgreSQL 9.2开始。在这之前命名参数仍然是一个好主意,用于文档
我怀疑您不想声明此函数。正如同义词所暗示的那样,它在任何空输入上返回NULL。看起来你想要一个空字符串。
还有一个性能影响:
SQL
PL/pgSQL
要点
表达式lengthx>0 x为纯文本,不包括和NULL。
使用100%等效表达式x。无论函数是否声明为严格函数,都可以更简单、更快地执行相同的操作
如果不需要,就不要使用。它只是为了兼容性和重命名预先确定的参数名。本手册积极劝阻将其用于其他目的。我从不使用它。命名参数自8.1版起可用。越简单越好。
在SQL函数中,可以引用参数名,而不是位置参数$1、$2、。。从PostgreSQL 9.2开始。在这之前命名参数仍然是一个好主意,用于文档
我怀疑您不想声明此函数。正如同义词所暗示的那样,它在任何空输入上返回NULL。看起来你想要一个空字符串。
还有一个性能影响:
您可能在寻找PL/pgSQL函数,而不仅仅是SQL函数。不知道这是否有助于您的实际函数。您是否打算在NULL输入时返回NULL?我怀疑您想要一个空字符串?可能您想要的是PL/pgSQL函数,而不仅仅是SQL函数。在您的示例中,请尝试使用。不知道这是否有助于您的实际函数。您是否打算在NULL输入时返回NULL?我怀疑您想要一个空字符串?在这种情况下,我建议不要将函数设置为严格的,因为查询计划器无法内联严格的函数。除非语义要求严格,否则应该忽略它。@CraigRinger:。但值得一提的是,在这种情况下,严格也会影响结果。在这种情况下,我建议不要对函数进行严格设置,因为查询计划器无法内联严格的函数。除非语义要求严格,否则应该忽略它。@CraigRinger:。但值得一提的是,严格也会影响本案的结果。不止一个人解决了这个问题——最终的关键是最后的语言声明。我坚持使用sql和used case语句。@Nickj:语言声明可以在不同的地方出现。不止一个人解决了这个问题——最后的关键是最后的语言声明。我坚持使用sql和用例语句。@Nickj:Language声明可以
在不同的地方。不使用别名+1。命名参数也可以由应用程序在运行时确定,并按照我们在LSMB中执行操作的方式使用。+1不使用别名。命名参数也可以由应用程序在运行时确定,并使用我们在LSMB中执行操作的方式。