【问题标题】:How do I reference named parameters in Postgres sql functions?如何在 Postgres sql 函数中引用命名参数?
【发布时间】:2012-03-19 13:58:09
【问题描述】:

这里是 Postgres 新手。

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

SQL 服务器:

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;

【问题讨论】:

    标签: sql postgresql stored-procedures


    【解决方案1】:

    已修订:正如 cmets 中所指出的,此答案在 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;
    

    【讨论】:

    【解决方案2】:

    您不能在使用 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

    【讨论】:

      猜你喜欢
      • 2018-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 2015-07-29
      • 1970-01-01
      • 2015-12-13
      相关资源
      最近更新 更多