带 if 语句的 Postgresql 函数
Postgresql function with if statement
如何让这个伪代码在 Postgresql 中工作:
create or replace function getf(arg character varying(255)) returns int
as $$
if arg = 'a' then return 1;
else return 2;
$$ language sql;
根据参数,我需要 return 一些值,没有其他 table 我需要查询。只需要在函数内部构建一个逻辑。
试图用 when 子句替换 if,但不知道该怎么做。
谢谢!
create or replace function getf(arg character varying(255)) returns int as $$
begin
if arg = 'a' then
return 1;
else
return 2;
end if;
end; $$ language plpgsql;
请注意,这是一个 PL/pgSQL 函数。
联机手册中有关于 PL/pgSQL 的精彩章节。这应该提供您开始编写过程函数所需的一切,并充分支持逻辑分支。
使用sql
语言,你可以使用case when:
create or replace function getf(arg character varying(255)) returns int as
$$
select case
when arg = 'a'
then 1
else 2
end
$$ language sql;
纯SQL函数。很丑,因为 SQL 没有 IF
。 (您可以改用 CASE
,这也很丑陋)需要 DISTINCT FROM
来捕获 NULL。
DROP function getf(_arg character varying(255) );
create or replace function getf(_arg character varying(255)) returns INTEGER
as $$
SELECT 1::integer
WHERE _arg = 'a'
UNION ALL
SELECT 2::integer
WHERE _arg IS DISTINCT FROM 'a'
;
$$ language sql;
SELECT getf( 'a' );
SELECT getf( 'b' );
SELECT getf( NULL );
create function getf(arg text) returns int
immutable strict language sql as $$
select case
when arg = 'a'
then 1
else 2
end
$$;
这几乎就像 Houari 的回答,但是:
- 它使用
text
作为参数类型 — 在 Postgres 中没有限制参数长度的意义,因为在表示上没有区别;
- 它是
immutable
,因此数据库可以缓存它来自相同参数的结果,这样可以更快;
- 它是
strict
,所以它不会是 运行 NULL 值,而只是 return NULL,因为它可能是一个编程错误,它被用于 NULL 值无论如何,如果它 return 2 for NULL. ,它可能会掩盖这个错误并使其更难调试
如何让这个伪代码在 Postgresql 中工作:
create or replace function getf(arg character varying(255)) returns int
as $$
if arg = 'a' then return 1;
else return 2;
$$ language sql;
根据参数,我需要 return 一些值,没有其他 table 我需要查询。只需要在函数内部构建一个逻辑。 试图用 when 子句替换 if,但不知道该怎么做。
谢谢!
create or replace function getf(arg character varying(255)) returns int as $$
begin
if arg = 'a' then
return 1;
else
return 2;
end if;
end; $$ language plpgsql;
请注意,这是一个 PL/pgSQL 函数。
联机手册中有关于 PL/pgSQL 的精彩章节。这应该提供您开始编写过程函数所需的一切,并充分支持逻辑分支。
使用sql
语言,你可以使用case when:
create or replace function getf(arg character varying(255)) returns int as
$$
select case
when arg = 'a'
then 1
else 2
end
$$ language sql;
纯SQL函数。很丑,因为 SQL 没有 IF
。 (您可以改用 CASE
,这也很丑陋)需要 DISTINCT FROM
来捕获 NULL。
DROP function getf(_arg character varying(255) );
create or replace function getf(_arg character varying(255)) returns INTEGER
as $$
SELECT 1::integer
WHERE _arg = 'a'
UNION ALL
SELECT 2::integer
WHERE _arg IS DISTINCT FROM 'a'
;
$$ language sql;
SELECT getf( 'a' );
SELECT getf( 'b' );
SELECT getf( NULL );
create function getf(arg text) returns int
immutable strict language sql as $$
select case
when arg = 'a'
then 1
else 2
end
$$;
这几乎就像 Houari 的回答,但是:
- 它使用
text
作为参数类型 — 在 Postgres 中没有限制参数长度的意义,因为在表示上没有区别; - 它是
immutable
,因此数据库可以缓存它来自相同参数的结果,这样可以更快; - 它是
strict
,所以它不会是 运行 NULL 值,而只是 return NULL,因为它可能是一个编程错误,它被用于 NULL 值无论如何,如果它 return 2 for NULL. ,它可能会掩盖这个错误并使其更难调试