如何在Postgres sql函数中引用命名参数?

时间:2012-03-19 13:58:10

标签: sql postgresql stored-procedures

Postgres noobie在这里。

我正在尝试将SQL Server存储过程转换为Postgres函数。目前无法弄清楚如何将此SQL行转换为Postgres。

SQL Server:

input: @name = null

SELECT *
FROM table
WHERE name = ISNULL(@name, name)

Postgres的:

input: n = null

SELECT *
FROM table
WHERE name = COALESCE(n, name)

我收到错误“列n不存在”。如何在Postgres函数的select语句中引用参数?

更新:

Postgres功能的定义

CREATE OR REPLACE FUNCTION fn_name (n VARCHAR(32) = NULL, name OUT varchar(32), description OUT varchar(64))
RETURNS setof record
AS 
$$
    SELECT u.name
        , u.description
    FROM table_a u
    WHERE u.name = COALESCE(n, u.name);

$$
LANGUAGE sql;

2 个答案:

答案 0 :(得分:17)

修订版:正如评论中指出的那样,这个答案在2012年初编写时是准确的,但自2012年底发布的v9.2版本以来,已经支持命名参数。

当您的函数位于language SQL时,参数名称仅仅是装饰。您可以在定义为language plpgsql的存储过程中按名称使用参数。

因此,您必须使用$ X引用函数args,其中X是函数参数列表的序数位置(从1开始)。

CREATE OR REPLACE FUNCTION fn_name (
  n VARCHAR(32) = NULL,
  OUT name varchar(32),
  OUT description varchar(64) )
RETURNS setof record
AS 
$$
    SELECT u.name
        , u.description
    FROM table_a u
    WHERE u.name = COALESCE($1, u.name);
$$
LANGUAGE sql;

答案 1 :(得分:11)

您不能在使用language = SQL定义的函数中使用命名参数。

您需要使用占位符$ 1。

CREATE OR REPLACE FUNCTION fn_name (n VARCHAR(32) = NULL, name OUT varchar(32), description OUT varchar(64))
RETURNS setof record
AS 
$$
    SELECT u.name
        , u.description
    FROM table_a u
    WHERE u.name = COALESCE($1, u.name);

$$
LANGUAGE sql;

手册中记录了此行为:http://www.postgresql.org/docs/9.0/static/xfunc-sql.html

  

就SQL函数本身而言,这些名称只是装饰;你仍然必须在函数体

中将参数称为$ 1,$ 2等

修改

从版本9.2开始,可以使用带有(普通)SQL函数的命名参数 http://www.postgresql.org/docs/9.2/static/xfunc-sql.html#XFUNC-SQL-FUNCTION-ARGUMENTS